即使使用MAX(id)也无法插入重复的键行

时间:2015-01-27 13:34:31

标签: sql-server tsql

在使用SQL Server 2008 R2的多用户系统上偶尔会遇到错误,例如"无法在对象' dbo.pages'中插入重复的键行。具有唯一索引' UX_pages_pageid_siteid'。重复键值为(141,4385)。"。该索引确实强制执行唯一性,但这是一个单一的陈述,应该保证唯一性,据我所知:

INSERT INTO pages (pageid, siteid) 
    SELECT (SELECT ISNULL(CAST(MAX(ABS([pageid])) AS int), 1000) + 1 
    FROM pages 
    WHERE siteid = 4385), 4385;

我知道使用自动递增标识会更清晰,但我无法更改架构。

该语句在o_Connection.BeginTrans()内执行,数据库有is_read_committed_snapshot_on = 1,我怀疑其参与但我无法重现该问题(例如通过INSERT INTO tblPapers (Url) SELECT MAX(url) + 'z' FROM tblPapers)修改this blog或者在锁定文档中找到任何解释。

嵌套SELECT是否真的可以提供过时的数据,即使它在同一个语句中,因此将代码更改为FROM pages (UPDLOCK)是正确的解决方法吗? / p>

1 个答案:

答案 0 :(得分:1)

可能无法扩展但请尝试

INSERT INTO pages with (tablock) (pageid, siteid) 
    SELECT (SELECT ISNULL(CAST(MAX(ABS([pageid])) AS int), 1000) + 1 
    FROM pages 
    WHERE siteid = 4385), 4385;

我刚刚阅读了评论 - 如果(UPDLOCK)工作,那么继续使用