如何得到上一次插入记录后自动产生的ID

时间:2022-03-30 07:32:32

1,http://www.cnblogs.com/ahuo/archive/2008/01/24/1051112.html

当运行完插入语句后,执行select   @@identity就可得到自动生成的id

如果是sql server 最好用select SCOPE_IDENTITY() as id
因为@@identity全局的

同类还有IDENT_CURRENT(‘table’)

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

==============================================================================

2,http://www.cnblogs.com/ghostljj/archive/2007/09/05/883304.html

示例:
INSERT INTO tablename
(Content,SameID)
VALUES ('内容',0)
; UPDATE tablename SET SameID=@@IDENTITY WHERE ID=@@IDENTITY
;SELECT @@IDENTITY

解析
; UPDATE tablename SET SameID=@@IDENTITY WHERE ID=@@IDENTITY
更新一个相同的列,用于例如要和ID自增列相同的结果

;SELECT @@IDENTITY
代码告诉 SQL Server 不要返回查询的行计数,然后执行 INSERT 语句,并返回刚刚为这个新行创建的 IDENTITY 值。

==============================================================================

3

如果你使用存储过程的话,将非常简单,代码如下:SET @NewID=@@IDENTITY

说明:
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。 

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。

示例

下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。

INSERT INTO infoclass (infoclass) VALUES ('Accountant')

这时我们插入一条记录,下面我们使用语句得到标识值:
SELECT @@IDENTITY AS 'Identity'
我的表infoclass中有个ID字段,它原的值是14插入新的记录后自动产生了值15,因些,上面命令执行后返回值:15。

下面说说如何在.NET中得到插入记录后的ID值。

因为Sqlserver为我们提供了多重查询的功能,这大大方便了我们的工作。请看:

如何得到上一次插入记录后自动产生的IDDim  sql  As   String   =   " INSERT INTO jobs (job_desc,min_lvl,max_lvl) VALUES ('A new job', 25, 100); "   &  _ 
如何得到上一次插入记录后自动产生的ID
" SELECT job_id FROM jobs WHERE job_id = @@IDENTITY "
如何得到上一次插入记录后自动产生的ID
Dim  cmd  As   New  SqlCommand(sql, cn)

上面可以看到,SqlCommand可以执行多条语句,各语句之间用“;"分隔。第一条执行插入,第二条则返回最后插入记录的ID值,因为查询返回的是单列的,并且值也是唯一的,所以可以使用ExecuteScalar获得:
Dim jobId As Integer = CInt(cmd.ExecuteScalar())

==============================================================================

插入记录后,获取记录的ID

基本知识 

1. IDENTITY 列不能由用户直接更新,它是由系统自动维护的。 

2.该列数据类型必须为数值型:int, smallint, tinyint, decimal or numeric with scale 0。 

3.该列不能为 null。 

4.不能在该列上设置缺省值。 

5.递增量只能为整形(比如:1,2,-3)。不能为小数,也不能为0。 

6.基值(种子值 seed)可以由用户设置,缺省值为1。 

理解 @@IDENTITY 

@@IDENTITY 返回最后一个插入 IDENTITY 的值,这些操作包括:INSERT, SELECT INTO,或者 bulk copy。如果在给没有 IDENTITY 列的其他表插入记录,系统将其置为 null。如果有多行记录插入到 IDENTITY 表中,@@IDENTITY 表示最后一个产生的值。如果触发了某个触发器,并且这个触发器执行向另一个带有 IDENTITY 列的表的插入操作,@@IDENTITY 将返回这个由触发器产生的值。如果这个触发器插入的表中不包含 IDENTITY 列,那么 @@IDENTITY 将为 null。如果插入操作失败,@@IDENTITY 值依然会增加,所以 IDENTITY 不保证数据的连续性。 

@@IDENTITY 是当前连接的全局变量,只对当前连接有效。也就是说,如果断开连接再重新连接后,@@IDENTITY 为 null。以 ADO 来说,@@IDENTITY 在 Connection 对象打开和关闭期间是有意义的,即在 Connection 对象的存在范围内有效。在 MTS 组件中,从打开连接到显式的关闭连接(Connection.Close)或者到调用了 SetAbort,SetComplete之前,在这期间,@@IDENTITY 有意义。 

使用 Truncate table 语句会使 IDENTITY 列重新开始计算。 

得到 @@IDENTITY 的值 

有三种方法(以下代码均使用 VBScript) 

方法一: 

Dim Conn, strSQL, Rs 
Set Conn = CreateObject("ADODB.Connection") 
’ Open a connection to the database 
Conn.Open("DSN=myDSN;;UID=myUID;;PWD=myPWD;;") 

’ Insert a new record into the table 
strSQL = "INSERT INTO mtTable (columnName) valueS (’something’)" 

’ Execute the SQL statement 
Conn.Execute(strSQL) 

’ Get the @@IDENTITY. 
strSQL = "SELECT @@IDENTITY AS NewID" 
Set Rs = Conn.Execute(lsSQL) 
NewID = Rs.Fields("NewID").value 

’ Close the connection 
Conn.Close() 
Set Conn = Nothing 

方法二(仅限于 ADO 2.0 以上): 

Dim Conn, strSQL, Rs 
Set Conn = CreateObject("ADODB.Connection") 
’ Open a connection to the database 
Conn.Open("DSN=myDSN;;UID=myUID;;PWD=myPWD;;") 

’ Insert a new record into the table 
lsSQL = "INSERT INTO myTable (columnName) valueS (’something’);;" &_ 

   "SELECT @@IDENTITY AS NewID;;" 

’ Execute the SQL statement 
Set Rs = Conn.Execute(lsSQL) 

’ Get the second resultset into a RecordSet object 
Set Rs = Rs.NextRecordSet() 

’ Get the inserted ID 
NewID = Rs.Fields("NewID").value 

’ Close the connection 
Conn.Close() 
Set Conn = Nothing 

方法三: 

Dim Conn, strSQL, Rs 
Set Conn = CreateObject("ADODB.Connection") 
’ Open a connection to the database 
Conn.Open("DSN=myDSN;;UID=myUID;;PWD=myPWD;;") 

’ Insert a new record into the table 
strSQL = "SET NOCOUNT ON;;" &_ 

   "INSERT INTO myTable (columnName) valueS (’something’);;" &_ 

   "SELECT @@IDENTITY AS NewID;;" 

’ Execute the SQL statement 
Set Rs = Conn.Execute(lsSQL) 

’ Get the inserted ID 
NewID = Rs.Fields("NewID").value 

’ Close the connection 
Conn.Close() 
Set Conn = Nothing

==============================================================================