iT邦幫忙

0

SQL update 指令錯誤"重複的索引鍵資料列"如何解決

MS SQL新手求助:
想將表2 的SN欄更新至表1的SN欄,卻無法成功
指令如下:
UPDATE [Prod1]
SET [Prod1].[SN] = [Prod2].[SN]
FROM [Prod1],[Prod2]
WHERE [Prod1].[ID] = [Prod2].[ID]

錯誤訊息如下:
無法在具有唯一索引 'IX_SN' 的物件 'dbo.Prod1' 中插入重複的索引鍵資料列。唯一索引鍵值是 (GA01)。
陳述式已經結束。

P.S.
1.[ID]是索引鍵但不能解除
2.若把這句改成
WHERE [Prod1].[ID] = 'a01'
是可以update成功的,不知為什麼?


表 1: prod1
ID name SN
a01 abc P0123
a02 dfe D1254
a03 dff P2256
a04 ggg D2223
a05 hhh P1125
a06 jjj D5563

表 2: prod2
ID name SN
a01 abc GA01
a02 dfe DA02
a03 dff PA56
a04 ggg DP22
a05 hhh PP12
a06 jjj DD56

*** 找到原因了,因為SN被設定成"唯一" "非叢集"索引
而我的SN資料有重複值(上表只是節錄)
還是很感謝各位熱心幫忙,
為避免此題一直掛著,
就將最佳解答給最先回應的大大好了!
祝大家工作順心~~

小魚 iT邦高手 1 級 ‧ 2018-12-13 19:35:40 檢舉
如果用INNER JOIN呢?

2 個回答

0
純真的人
iT邦高手 1 級 ‧ 2018-12-13 20:15:36
最佳解答

應該是這樣吧?

UPDATE [Prod1]
SET [Prod1].[SN] = [Prod2].[SN]
FROM [Prod2]
WHERE [Prod1].[ID] = [Prod2].[ID]
utopia iT邦新手 3 級 ‧ 2018-12-14 10:29:18 檢舉

這樣會出現:
訊息 4104,層級 16,狀態 1,行 4
無法繫結多重部分 (Multi-Part) 識別碼 "Prod2.ID"。

utopia iT邦新手 3 級 ‧ 2018-12-14 11:16:09 檢舉

*** 找到原因了,因為SN被設定成"唯一" "非叢集"索引
而我的SN資料有重複值(上表只是節錄)
還是很感謝各位熱心幫忙,
為避免此題一直掛著,
就將最佳解答給最先回應的大大好了!
祝大家工作順心~~

喔~~原來是複寫的SN設定唯一值
所以當SN出現相同資料就會更新失敗~

0
rogeryao
iT邦研究生 4 級 ‧ 2018-12-13 21:43:35
update A
set A.SN=B.SN
from prod2 as A
inner join prod1 as B on B.ID=A.ID 

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=0b43108491fbcb8848c76826448d4e52

utopia iT邦新手 3 級 ‧ 2018-12-14 10:50:39 檢舉

在我的SQL2008 SERVER執行結果是:
訊息 2601,層級 14,狀態 1,行 1
無法在具有唯一索引 'IX_SN' 的物件 'dbo.Prod1' 中插入重複的索引鍵資料列。唯一索引鍵值是 (GA01)。
陳述式已經結束。

但在大大提供的網站上,
就算執行我原來的寫法,
也是可以成功UPDATE耶,
真是奇怪!!!

我要發表回答

立即登入回答