标识列SQL Server 2005两次插入相同的值

时间:2010-05-17 09:10:35

标签: sql sql-server-2005 identity-column

我有一个插入表的存储过程(其中有一个不是主键的标识列 - 最初使用日期/时间插入PK来生成唯一值)。

然后我们使用SCOPEIDENTITY()来获取插入的值,然后根据此值生成主键字段值,然后将其更新回表。

在某些情况下,存储过程由多个进程同时调用,导致“违反PRIMARY KEY约束...”错误。

这似乎表明标识列允许为多个记录插入相同的数字。

第一个问题 - 这怎么可能?

第二个问题 - 如何阻止它...目前没有错误处理因此我将添加一些try / catch逻辑 - 但是想要完全理解问题以正确处理

3 个答案:

答案 0 :(得分:2)

更仔细地查看错误消息:

  

违反 PRIMARY KEY 约束......

鉴于你说:

  

如果标识列不是主键 - 最初使用日期/时间插入PK以生成唯一值

我认为问题与标识列无关,因为它不是主键,但更有可能日期/时间方法生成唯一值,尝试插入时失败。

是否有一些原因您不仅仅使用标识列作为主键?

答案 1 :(得分:1)

我认为,您应该使用 IDENT_CURRENT('tablename')

SCOPE_IDENTITY(),将返回当前会话中创建的最后一个标识值。

IDENT_CURRENT 不受范围和会话的限制;它仅限于指定的表格。

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

您可以在这里阅读有关您的问题的信息

http://web.archive.org/web/20130605142906/http://connect.microsoft.com/SQLServer/feedback/details/328811/

和另一篇关于并行性的有用文章

https://sqlblog.org/2009/03/21/six-reasons-you-should-be-nervous-about-parallelism

祝你好运!

答案 2 :(得分:0)

  
    

最初使用日期/时间插入PK以生成唯一值

  

你确定这是造成问题的身份吗?如果您将当前日期/时间值作为PK的初始值插入,并且它同时由2个不同的线程/进程执行,则您可能获得相同的值。