2013-02-25 112 views
1
insert into A (id,Name) 
select ti.id,ti .Name 
from A ti 
where ti.id >= 1 AND ti.id<=3 

id是主鍵,但不是自動生成的。當我運行查詢,我得到一個錯誤PRIMARY KEY約束「XPKA」的無法插入重複密鑰SQL

衝突。不能在對象中插入重複鍵「dbo.A」

TABEL一個

id Name 
1 A 
2 B 
3 C 

,我想插入

id Name 
4 A 
5 B 
6 C 
+3

它只是意味着你要插入一個已經存在於表上的值。你可以提供一些表格格式的記錄嗎?或者你可以多解釋一下你想做的事情。 – 2013-02-25 14:24:46

+0

主鍵應該是唯一的 – 2013-02-25 14:25:17

+0

爲什麼你給我們一個'INSERT'和一個'SELECT'?這是一個(!)查詢嗎? – 2013-02-25 14:25:38

回答

3

每一行必須有主鍵不同的值柱。您將A中的記錄重新插入到自身中,因此您正嘗試使用已在使用的主鍵值創建新行。這會導致您看到的錯誤消息。

如果您必須以這種方式插入記錄,那麼您需要在PK列中包含一個包含唯一值的策略。如果您不能使用autoincrement規則(常規方法),那麼您的邏輯需要強制執行此要求,否則您將繼續看到類似的錯誤。

+0

對不起,我不想調整自動增量的主鍵。你有其他選擇。 – enigma 2013-02-25 14:32:21

+0

如果你不想調整PK領域,那很好。但這就是你收到你所詢問的錯誤的原因。 – 2013-02-25 14:33:12

2

您從表A中選擇並直接插入。這意味着您插入的ID值肯定會在那裏。

消息說ID col上有一個PrimaryKey,並要求該列中的值是唯一的。它不會讓你執行這個動作。

要解決您的查詢根據您所陳述的需求,改變腳本:

insert into A (id,Name) 
select ti.id + 3,ti .Name 
from A ti 
where ti.id >= 1 AND ti.id<=3 
0

至於雅各布·埃利斯說...

每一行必須有主不同的值鍵列。

而當你有一種收縮你的行共3個EVER

那些具有WHERE子句的唯一ID的1,2和3

所以,如果你想要更換這些而不是特林將它們插入已存在的位置並生成錯誤。

也許你可以更新它們呢? 這將解決您的問題。

UPDATE

您添加額外的代碼後... 你應該設置你的唯一鍵標識的ID號,而不是ABC字段名(無論你把它叫做)

1

您需要調整你插入的行的ID。在你的榜樣,產生按鍵4,5,6:

insert into A (id,Name) 
select ti.id + 3 as NewKey,ti.Name 
from A ti 
where ti.id >= 1 AND ti.id<=3 

但在現實中,你需要選擇,將讓您的新密鑰值從任何可能的舊鑰匙分開,也許:

insert into A (id,Name) 
select ti.id + 100000 as NewKey,ti.Name 
from A ti 
where ti.id >= 1 AND ti.id<=3