使⽤SQLServer获取插⼊记录后的ID(⾃动编号)
最近在开发项⽬的过程中遇到⼀个问题,就是在插⼊⼀条记录的后要⽴即获取所在数据库中ID,⽽该ID是⾃增的,怎么做?在sql server 2005中有⼏种⽅式可以实现。
要获取此ID,最简单的⽅法就是在查询之后select @@indentity--SQL语句创建数据库和表复制代码 代码如下:
create database dbdemogo
use dbdemogo
create table tbldemo(
id int primary key identity(1,1), name varchar(20))go
--执⾏下⾯SQL语句就能查出来刚插⼊记录对应的⾃增列的值insert into tbldemo values('测试') select @@identity
SQL Server 2000中,有三个⽐较类似的功能:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插⼊到 IDENTITY 列中的值。
1)IDENT_CURRENT 返回为任何会话和任何作⽤域中的特定表最后⽣成的标识值,它不受作⽤域和会话的,⽽受限于所指定的表。
2)@@IDENTITY返回为当前会话的所有作⽤域中的任何表最后⽣成的标识值。 3) SCOPE_IDENTITY 返回为当前会话和当前作⽤域中的任何表最后⽣成的标识值。
SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所⽣成的最后⼀个标识值。但是,SCOPE_IDENTITY只返回插⼊到当前作⽤域中的值;@@IDENTITY 不受限于特定的作⽤域。
例如,有两个表 T1 和 T2,在 T1 上定义了⼀个 INSERT 触发器。当将某⾏插⼊ T1 时,触发器被激发,并在 T2 中插⼊⼀⾏。此例说明了两个作⽤域:⼀个是在 T1 上的插⼊,另⼀个是作为触发器的结果在 T2 上的插⼊。
假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。@@IDENTITY 返回插⼊到当前会话中任何作⽤域内的最后⼀个 IDENTITY 列值,该值是插⼊ T2 中的值。
SQL Server 返回最后插⼊记录的⾃动编号ID
最近在开发项⽬的过程中遇到这么⼀个问题,就是在插⼊⼀条记录的后⽴即获取其在数据库中⾃增的ID,以便处理相关联的数据,怎么做?在sql server 2000中可以这样做,有⼏种⽅式。详细请看下⾯的讲解与对⽐。⼀、要获取此ID,最简单的⽅法就是:(以下举⼀简单实⽤的例⼦)--创建数据库和表
create database MyDataBaseuse MyDataBasecreate table mytable(
id int identity(1,1),name varchar(20))
--执⾏这个SQL,就能查出来刚插⼊记录对应的⾃增列的值insert into mytable values('李四')select @@identity⼆、三种⽅式的⽐较
SQL Server 2000中,有三个⽐较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插⼊到 IDENTITY 列中的值。
IDENT_CURRENT 返回为任何会话和任何作⽤域中的特定表最后⽣成的标识值。IDENT_CURRENT 不受作⽤域和会话的限
制,⽽受限于指定的表。IDENT_CURRENT 返回为任何会话和作⽤域中的特定表所⽣成的值。@@IDENTITY 返回为当前会话的所有作⽤域中的任何表最后⽣成的标识值。SCOPE_IDENTITY 返回为当前会话和当前作⽤域中的任何表最后⽣成的标识值
SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所⽣成的最后⼀个标识值。但是,SCOPE_IDENTITY只返回插⼊到当前作⽤域中的值;@@IDENTITY 不受限于特定的作⽤域。
例如,有两个表 T1 和 T2,在 T1 上定义了⼀个 INSERT 触发器。当将某⾏插⼊ T1 时,触发器被激发,并在 T2 中插⼊⼀⾏。此例说明了两个作⽤域:⼀个是在 T1 上的插⼊,另⼀个是作为触发器的结果在 T2 上的插⼊。
假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。@@IDENTITY 返回插⼊到当前会话中任何作⽤域内的最后⼀个 IDENTITY 列值,该值是插⼊ T2 中的值。
SCOPE_IDENTITY() 返回插⼊ T1 中的 IDENTITY 值,该值是发⽣在相同作⽤域中的最后⼀个 INSERT。如果在作⽤域中发⽣插⼊语句到标识列之前唤醒调⽤ SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。⽽IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 返回的值分别是这两个表最后⾃增的值。ajqc的实验:(40条本地线程,40+40条远程线程同时并发测试,插⼊1200W⾏),得出的结论是:
1.在典型的级联应⽤中.不能⽤@@IDENTITY,在CII850,256M SD的机器上1W多⾏时就会并发冲突.在P42.8C,512M DDR上,才6000多⾏时就并发冲突.
2.SCOPE_IDENTITY()是绝对可靠的,可以⽤在存储过程中,连触发器也不⽤建,没并发冲突SELECT IDENT_CURRENT('TableName') --返回指定表中⽣成的最后⼀个标⽰值 SELECT IDENT_INCR('TableName')--返回指定表的标⽰字段增量值SELECT IDENT_SEED('TableName')--返回指定表的标⽰字段种⼦值返回最后插⼊记录的⾃动编号
SELECT IDENT_CURRENT('TableName')返回下⼀个⾃动编号:
SELECT IDENT_CURRENT('TableName') + (SELECT IDENT_INCR('TableName'))SELECT @@IDENTITY --返回当前会话所有表中⽣成的最后⼀个标⽰值
以上是针对sql server 2000的情况,但是诸如my sql或oracle中如何实现呢?怎么处理呢?本⼈也在摸索中。。。。如有朋友知道此处理⽅式,别忘了告之,⼀同分享!