为啥 MERGE 语句会抛出唯一键约束错误

Posted

技术标签:

【中文标题】为啥 MERGE 语句会抛出唯一键约束错误【英文标题】:Why is the MERGE statement throwing a unique key constraint error为什么 MERGE 语句会抛出唯一键约束错误 【发布时间】:2018-09-07 00:03:39 【问题描述】:

我正在尝试在两个表(表 A 和表 B)之间运行合并语句。如果指定字段(名称)上存在匹配项,则该语句应该更新记录,如果不存在匹配项,则插入记录。

当合并语句执行时,它会抛出以下错误:

Violation of UNIQUE KEY constraint 'AK_UniqueName'. Cannot insert duplicate key in object 'dbo.Table B'. The duplicate key value is (A. Adams).

Merge 语句、表 A、表 B 和所需结果如下:

合并语句

BEGIN
MERGE dbo.TableB AS T
USING dbo.TableA AS S
ON T.Name LIKE S.Name
WHEN MATCHED THEN
UPDATE SET T.Lname = IsNULL(S.Lname,T.Lname),          
WHEN NOT MATCHED THEN 
INSERT (Name, Lname);
END

表 A

**Name**   **Lname**
A. Adams   Adams
B. Adams   Adams

表 B

**Name**   **Lname**
A. Adams   Adams
C. Adams   Adams

期望的结果(合并后的表 B - 一个新行)

**Name**   **Lname**
A. Adams   Adams
B. Adams   Adams
C. Adams   Adams

【问题讨论】:

您的源中有重复的行,或者您正在更新主键。这就是我从不使用MERGE 的原因。如果这是单独的 UPDATEINSERT 语句,您可以将问题隔离到其中之一。我建议您检查 [Table A] 是否有重复项。 我也不知道要求,但ON T.Name LIKE S.Name 不太可能是正确的。你应该改用ON T.Name = S.Name 吗? @Nick.McDermaid - 我可以确认我没有合并到同一张桌子上。 Name 不是主键,但 TableB 确实对 Name 字段有唯一约束。但由于 A 中的 A. Adams 与 B 中的 A. Adams 匹配,因此我期待更新而不是插入。 啊,让我试试用 = vs Like 运行它 @Nick.McDermaid - = 符号成功了。如果你愿意回答这个问题,复选标记就是你的。非常感谢, 【参考方案1】:

这通常发生在源中存在重复行或更新主键时。

这就是我很少使用MERGE 的原因。相反,我使用单独的 UPDATEINSERT 语句,这允许您将问题隔离到插入或更新步骤。

ON T.Name LIKE S.Name 不太可能是正确的。请改用ON T.Name = S.Name

【讨论】:

以上是关于为啥 MERGE 语句会抛出唯一键约束错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥 BluetoothSetLocalServiceInfo 会抛出错误 1314?

为啥 jsonwebtoken 会抛出“无效签名”错误?

为啥 XCode 会抛出重复的符号错误?

为啥 Python informixdb 包会抛出错误!

为啥雪花 jdbc 会抛出 [XX000][200001] 错误

为啥 MeasureString 会抛出读/写内存错误?