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子句,它将停止错误,但返回的错误中可能有值,以便您知道数据尚未保存。