SQL Server更新语句错误
我正在编写一个脚本来更新复制联系人及其引用的所有表 我拥有的更新语句之一如下:SQL Server更新语句错误,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我正在编写一个脚本来更新复制联系人及其引用的所有表 我拥有的更新语句之一如下: /* update the contactid, and the compcontactid on the compcontact table */ UPDATE cmpc SET cmpc.contactid = tt.contactid, cmpc.compcontactid = (SELECT MAX(cc.compcontactid) FROM c
/* 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,第14级,状态1,第255行
无法在具有唯一索引“XPKcompcontact”的对象“dbo.compcontact”中插入重复的键行。重复的键值为A000UZCU、A00JTCAP、X00GM2NF
有人能解释为什么会发生这种情况,以及解决办法是什么吗
这是因为它正在尝试更新具有唯一键值的值。您正在尝试将唯一键值更新为列中已存在的值。这是不允许的,因为唯一键中的每个值都必须是唯一的。您正在尝试将唯一键值更新为列中已存在的值。这是不允许的,因为unique key中的每个值都必须是唯一的。正如@sion\u corn所说,您正在尝试更新具有unique key约束的列。 尝试在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
正如@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
通过添加where子句,它将停止错误,但返回的错误中可能有值,以便您知道数据尚未保存。通过添加where子句,它将停止错误,但返回的错误中可能有值,以便您知道数据尚未保存。