无法插入重复键SQL

时间:2013-02-25 14:23:06

标签: sql sql-server

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'。无法在对象'dbo.A'中插入重复键

tabel A

id Name
1   A
2   B
3   C

我要插入

id Name
4   A
5   B
6   C

4 个答案:

答案 0 :(得分:4)

每行必须具有不同的主键列值。您正在将A中的记录插回自身,因此您尝试使用已使用的主键值创建新行。这会导致您看到错误消息。

如果必须以这种方式插入记录,则需要包含在PK列中包含唯一值的策略。如果您不能使用autoincrement规则(常规方法),那么您的逻辑需要强制执行此要求,否则您将继续看到这样的错误。

答案 1 :(得分:3)

您正在从表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

答案 2 :(得分: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

答案 3 :(得分:0)

正如Yaakov Ellis所说......

  

每行必须具有不同的主键列值。

因为你有一个WHERE子句,将你的行总数限制为3 EVER

拥有唯一身份证1,2和3的人

因此,如果您想要替换它们而不是将它们插入已存在的位置并生成错误。

也许你可以更新它们吗? 这将解决您的问题。

更新

添加额外代码后...... 您应该将UNIQUE密钥标识符设置为ID号而不是ABC字段名称(无论您调用它)