sql – MERGE违反PRIMARY KEY约束

前端之家收集整理的这篇文章主要介绍了sql – MERGE违反PRIMARY KEY约束前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个sql Server 2008多对多关系表(Assets),有两列:
AssetId (PK,FK,uniqueidentifier,not null)
AssetCategoryId (PK,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表时,没有这样的记录……所以我很困惑我将如何插入一个重复的密钥.

知道这里发生了什么吗?

UPDATE

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

解决方法

您需要在MERGE语句中添加HOLDLOCK.请尝试以下方法
MERGE INTO Assets WITH (HOLDLOCK) AS Target
...

这可以避免您遇到的竞争条件.查看更多信息here

编辑

根据您的更新,我能想到的另一件事是您的临时表中可能有重复的记录.你能仔细检查吗?

猜你在找的MsSQL相关文章