2013-02-25 113 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