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
答案 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字段名称(无论您调用它)