gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:21:05 26 4
gpt4 key购买 nike

在使用 SQL Server 2008 R2 的多用户系统上,我偶尔会遇到这样的错误:“无法在具有唯一索引 'UX_pages_pageid_siteid' 的对象 'dbo.pages' 中插入重复的键行。重复的键值为 (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_commissed_snapshot_on = 1,我怀疑涉及该问题,但我无法重现该问题(例如,通过修改 this blog使用 INSERT INTO tblPapers (Url) SELECT MAX(url) + 'z' FROM tblPapers) 或在锁定文档中查找任何解释。

嵌套的SELECT是否确实可能提供过时的数据,即使它位于同一个语句中,因此将代码更改为FROM页面(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 - 即使使用 MAX(id) 也无法插入重复的键行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28171784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com