gpt4 book ai didi

sql - MERGE 违反 PRIMARY KEY 约束

转载 作者:行者123 更新时间:2023-12-02 15:08:18 25 4
gpt4 key购买 nike

我有一个包含两列的 SQL Server 2008 多对多关系表 (Assets):

AssetId (PK, FK, uniqueidentifier, not null)
AssetCategoryId (PK, FK, int, not null)

在我的项目中,我需要从此表中获取行,并定期将它们插入到复制数据库中。因此,我有两个完全相同的数据库(包括约束)。

为了从一个数据库“复制”到另一个数据库,我使用带有临时表的 MERGE 语句。我在临时表中插入最多 50 条记录,然后将临时表与我复制到的 Assets 表合并,如下所示:

CREATE TABLE #Assets (AssetId UniqueIdentifier, AssetCategoryId Int);
INSERT INTO #Assets (AssetId, AssetCategoryId) VALUES ('ed05bac3-7a92-46aa-8822-2d882b137597', 44), ('dc5e3082-e2eb-4bdf-a640-94e0f59411ed', 22) ... ;

MERGE INTO Assets WITH (HOLDLOCK) AS Target
USING #Assets AS Source
ON Target.AssetId = Source.AssetId AND Target.AssetCategoryId = Source.AssetCategoryId
WHEN MATCHED THEN
UPDATE SET ...
WHEN NOT MATCHED BY Target THEN
INSERT (AssetId,AssetCategoryId) VALUES (Source.AssetId,Source.AssetCategoryId);

在大多数情况下,这非常有效。但是,偶尔我会收到错误:

Violation of PRIMARY KEY constraint 'PK_Assets'. Cannot insert duplicate key in object 'dbo.Assets'. The duplicate key value is (dc5e3082-e2eb-4bdf-a640-94e0f59411ed, 22). The statement has been terminated.

当我检查Assets表时,不存在这样的记录...所以我很困惑如何插入重复的键。

知道这里发生了什么吗?

更新

测试时,成功运行6次,插入300行。在第七次尝试时,它总是给出与上面所示相同的错误。此外,当我单独 INSERT (dc5e3082-e2eb-4bdf-a640-94e0f59411ed, 22) 时,它工作得很好。然后我的测试能够继续并插入剩余的行,没有错误。

最佳答案

您需要在 MERGE 语句中添加 HOLDLOCK。请尝试以下操作:

MERGE INTO Assets WITH (HOLDLOCK) AS Target
...

这可以避免您遇到的竞争情况。查看更多信息here

编辑

根据您的更新,我唯一能想到的是您的临时表中可能有重复的记录。你能再检查一下吗?

关于sql - MERGE 违反 PRIMARY KEY 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10724348/

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