2010-10-05 51 views
2

我看了一些其他问题,它们似乎与SQL-Server无关。SQL-Server常见问题 - 检索刚刚插入的ID

给出的简单示例查询:

INSERT INTO tblComments (comment, user) VALUES ('lol', 'Guest') 

现在假设创建新用户后,我需要插入在需要最后输入ID其它表更多的数据,我会做:

SELECT TOP 1 ID FROM tblComments ORDER BY ID DESC 

要检索最后输入的ID,(希望)在此期间没有执行任何查询,并且返回的ID确实是前一个查询的值。

我确保我的表格正常化,但是我有时遇到插入值可能不必独特的情况,所以我如何保证返回的ID是插入的最后一个?

回答

6

您的方法受到竞争条件的限制。

相反,使用SCOPE_IDENTITY

select scope_identity() 
+0

如果你把两个查询放在同一个事务中,你应该相当确定它是正确的ID。 – 2010-10-05 12:21:10

+0

竞赛条件或种族危害是电子系统或过程中的缺陷,由此过程的输出和/或结果出乎意料且严重依赖于其他事件的顺序或时间。该术语源于两个信号相互竞争以首先影响输出的想法。 (Wikipedia) – 2010-10-05 12:22:28

+0

这个问题被标记为'uniqueidentifier' – 2010-10-05 12:23:45

0

除了@ RedFilter的建议,你也应该看:如果你想这是插入任何 最后 身份

  1. @@ IDENTITY即使插入在当前范围内没有完成 。
  2. IDENT_CURRENT获取插入到特定表 中的最后一个 标识,无论会话或范围如何。

在你的情况下,SCOPE_IDENTITY可能是要走的路,除非你想获得该身份,即使它被插入到不同的会话或范围中。

而只是要清楚SCOPE_IDENTITY返回插入到当前会话和作用域中的任何表中的最后一个标识。