SQL Server更新语句错误

时间:2014-05-01 18:02:08

标签: 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 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)。

任何人都可以解释为什么会发生这种情况,解决方案是什么?

这是因为它正在尝试更新具有

的值

2 个答案:

答案 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