我正在编写一个脚本来更新重复的联系人及其所引用的所有表。
我所拥有的更新声明之一如下:
/* update the contactid, and the compcontactid on the compcontact table */
UPDATE cmpc
SET cmpc.contactid = tt.contactid,
cmpc.compcontactid = (SELECT MAX(cc.compcontactid)
FROM compcontact cc
INNER JOIN @tempDupContacts tdup ON tdup.contactid = cc.contactid
INNER JOIN @tempTable tt ON tt.namefml = tdup.namefml)
FROM compcontact cmpc
INNER JOIN @tempDupContacts tdup ON tdup.contactid = cmpc.contactid
INNER JOIN @tempTable tt ON tt.namefml = tdup.namefml
但是,当我运行脚本时(脚本太长而无法发布),我收到以下错误:
Msg 2601,Level 14,State 1,Line 255
无法在对象' dbo.compcontact'中插入重复的键行。具有独特的索引' XPKcompcontact'重复键值为(A000UZCU,A00JTCAP,X00GM2NF)。
任何人都可以解释为什么会发生这种情况,解决方案是什么?
这是因为它正在尝试更新具有
的值答案 0 :(得分:4)
您正在尝试将唯一键值更新为列中已存在的值。这是不允许的,因为唯一键中的每个值都必须是唯一的。
答案 1 :(得分:0)
正如@sion_corn所说,您正在尝试更新具有唯一键约束的列。 尝试在update语句中添加WHERE子句以排除已存在的值。
例如:
UPDATE cmpc
SET cmpc.contactid = tt.contactid,
cmpc.compcontactid = (SELECT MAX(cc.compcontactid)
FROM compcontact cc
INNER JOIN @tempDupContacts tdup ON tdup.contactid = cc.contactid
INNER JOIN @tempTable tt ON tt.namefml = tdup.namefml
WHERE cc.compcontactid <> cmpc.compcontactid)
FROM compcontact cmpc
INNER JOIN @tempDupContacts tdup ON tdup.contactid = cmpc.contactid
INNER JOIN @tempTable tt ON tt.namefml = tdup.namefml
WHERE cmpc.contactid <> tt.contactid