繁体   English   中英

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

[英]Identity column SQL Server 2005 inserting same value twice

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

然后,我们使用SCOPEIDENTITY()获取插入的值,然后有一些逻辑根据该值生成主键字段值,然后将其更新回到表中。

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

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

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

第二个问题-如何停止它...目前尚无错误处理,因此我将添加一些try / catch逻辑-但想充分理解该问题以正确处理

仔细查看错误消息:

违反主键约束...

鉴于你说的:

那里有一个不是主键的标识列-最初使用日期/时间插入PK以生成唯一值

在我看来,问题与身份列无关,因为它不是主键,但日期/时间方法很可能不会生成唯一值,并且在您尝试插入时失败。

您是否由于某些原因而不仅仅是使用标识列作为主键?

我认为,您应该改用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

祝好运!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM