【发布时间】:2013-08-14 04:05:19
【问题描述】:
查询以获得下一个身份?这对于没有删除记录的表是可能的:
SELECT TOP 1 EMPID + 1 FROM Employee ORDER BY EMPID DESC
如果有删除数据,我将如何获得下一个身份?例如我有一个这样的表:
EMPID NAME
4001 someName
4002 someName
4003 ----------------------- this is deleted
4004 someName
4005 someName
4006 someName
4007 someName
4008 someName
4009 ----------------------- this is deleted
4010 ----------------------- this is deleted
输出必须是 4011
【问题讨论】:
-
这很愚蠢。如果您在最终执行插入时查询下一个身份可能是什么,那么其他人可能已经生成了一个新值(提交或回滚),从而使您的猜测完全不准确。无论如何,出示身份证有什么意义?身份值应该是最终用户不需要知道或关心的透明代理。如果他们这样做了,则提交插入,然后然后向他们展示他们得到了什么,而不是向他们展示他们可能得到什么。
-
SQL Server 不会“回收”已删除的标识值 - 这是一件好事!
-
先执行插入,然后然后显示在您的表单上。为什么您的用户需要在您将 ID 值分配给他们之前知道他们将获得什么 ID 值?如果错了,这对他们有什么帮助?
-
看我的第一条评论!执行插入,然后检索实际使用的标识值。
-
@Karlx 你完全没有抓住重点。通过打开两个管理工作室窗口来模拟您的应用程序的两个用户。在每一个中运行您的
IDENT_CURRENT查询并输出结果。现在,在一个窗口中插入表格,然后插入另一个窗口,在这两种情况下检查SCOPE_IDENTITY()。他们都 100% 不可能匹配IDENT_CURRENT输出,但是您在表单上向两个用户显示了该 ID。请注意,在这两个会话中,您都没有删除任何内容。
标签: sql tsql sql-server-2008-r2 identity-column