在SQLServerMySQL数据库中如何取得刚插入的标识值

在SQLServerMySQL数据库中如何取得刚插入的标识值,第1张

概述  在SQLServer/MySQL数据库中如何取得刚插入标识值 在SQLServer数据库中 数据库实际应用中,我们往往需要得到刚刚插入 的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么? (1)、有时我们会使用 SELECT @@Identity 来获得我们刚刚插入的值,比如下面的代码 代码一: use tempdb if exists (select * from s  

在sqlServer/MysqL数据库中如何取得刚插入的标识值

在sqlServer数据库中

数据库实际应用中,我们往往需要得到刚刚插入 的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么?
(1)、有时我们会使用 SELECT @@IDentity 来获得我们刚刚插入的值,比如下面的代码

代码一:
use tempdb
if exists (select * from sys.objects where object_ID = object_ID(N'[test1]') and type in (N'u'))
drop table [test1]
go
create table test1
(
ID int IDentity(1,1),
content nvarchar(100)
)
insert into test1 (content) values ('solorez')
select @@IDentity

乐观情况下,这样做是没问题的,但如果我们如果先运行下面的代码二创建一个触发器、再运行代码三:

代码二:
create table test2
(
ID int IDentity(100,
content nvarchar(100)
)

create trigger tri_test1_IDentitytest_I
on test1 after insert
as
begin
insert into test2
select content from inserted
end

代码三:
insert into test1 (content) values ('solorez2')
select @@IDentity
 
我们可以看到,此时得到的标识值已经是100多了,很明显,这是表test2的生成的标识值,已经不是我们想要的 了。
我们可以看看@@IDentity的定义:IDentity
原来,@@IDentity返回的是当前事务最后插入的标识值,因为在Insert Test1表执行后,紧接着触发了触发器又Insert Test2表,所以,这时候@@IDentity的值就是表test2的生成的标识值。

(2)、这 时我们或许会用下面的方法:

代码四:
insert into test1 (content) values ('solorez3')
SELECT IDENT_CURRENT('test1')

看来结果还比较正确,但如果我们在多次运行代码四的同时运行下面的代码五:

代码五:
insert into test1 (content) values ('solorez3')

waitfor delay '00:00:20'
SELECT IDENT_CURRENT('test1')
 
结果又 不是我们想要的了!
再看看IDENT_CURRENT(tablename) 的定义:IDENT_CURRENT(tablename)
是 返回指定表的最后标识值。

(3)、到这里,是该亮出答案的时候了,我们可以使用下面的代码:

代码六:
insert into test1 (content) values ('solorez3')
SELECT scope_IDentity()

这时,我们无论是添加触发器还是运行并行插入,得到的始终是当前事务的标识值。

scope_IDentity()的定义:scope_IDentity()返回为当前会话和当前作用域中的某个表生成的最新标识值

 

三个函数的区别:

IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。

@@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。

ScopE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。

 

 

在MysqL数据库中

一般情况下获取刚插入的数据的ID,使用select max(ID) from table 是可以的。

但在多线程情况下,就不行了。

下面介绍三种方法

(1)   getGeneratedKeys()方法:

(2)LAST_INSERT_ID:

LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

在多用户交替插入数据的情况下max(ID)显然不能用。

这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对auto_INCREMENT列最新的insert or update*作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。

可以用 SELECT LAST_INSERT_ID(); 查询LAST_INSERT_ID的值.

使用单INSERT语句插入多条记录,LAST_INSERT_ID只返回插入的第一条记录产生的值.

 (3)select @@IDENTITY:

String sql=”select @@IDENTITY”;

@@IDentity是表示的是最近一次向具有IDentity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是ID,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@IDentity得到的值就是101。使用@@IDentity的前提是在进行insert *** 作后,执行select @@IDentity的时候连接没有关闭,否则得到的将是NulL值。

总结

以上是内存溢出为你收集整理的在SQLServer/MySQL数据库中如何取得刚插入的标识值全部内容,希望文章能够帮你解决在SQLServer/MySQL数据库中如何取得刚插入的标识值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1181027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存