即使使用 MAX(id) 也无法插入重复的键行
Cannot insert duplicate key row even when using MAX(id)
在使用 SQL Server 2008 R2 的多用户系统上,我偶尔会遇到类似 "Cannot insert duplicate key row in object 'dbo.pages' with unique index 'UX_pages_pageid_siteid'. The duplicate key value is (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 我怀疑涉及但我无法重现该问题(例如通过修改 this blog 为 INSERT INTO tblPapers (Url) SELECT MAX(url) + 'z' FROM tblPapers)
或在锁定文档中找到任何解释。
嵌套的 SELECT
是否真的可能提供过时的数据,即使它在同一条语句中,因此将代码更改为 FROM pages (UPDLOCK)
是正确的解决方法?
可能无法扩展,但请尝试
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) 有效,则继续使用
在使用 SQL Server 2008 R2 的多用户系统上,我偶尔会遇到类似 "Cannot insert duplicate key row in object 'dbo.pages' with unique index 'UX_pages_pageid_siteid'. The duplicate key value is (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 我怀疑涉及但我无法重现该问题(例如通过修改 this blog 为 INSERT INTO tblPapers (Url) SELECT MAX(url) + 'z' FROM tblPapers)
或在锁定文档中找到任何解释。
嵌套的 SELECT
是否真的可能提供过时的数据,即使它在同一条语句中,因此将代码更改为 FROM pages (UPDLOCK)
是正确的解决方法?
可能无法扩展,但请尝试
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) 有效,则继续使用