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"中插入重复的密钥
表A
id Name
1 A
2 B
3 C
我想插入
id Name
4 A
5 B
6 C
每一行的主键列都必须有不同的值。您正在将A
中的记录插入回其自身,因此您正试图使用已在使用的主键值创建新行。这将导致您看到的错误消息。
如果必须以这种方式插入记录,则需要在PK列中包含一个包含唯一值的策略。如果您不能使用autoincrement
规则(正常方法(,那么您的逻辑需要强制执行此要求,否则您将继续看到这样的错误。
您从表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
您需要调整要插入的行的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
每一行的主键列都必须有不同的值。
因为你有一个WHERE子句,它将你的行限制在总共3个EVER
具有唯一Id的1、2和3
因此,如果你想替换它们,而不是字符串插入它们已经存在的地方,并生成错误。
也许你可以更新它们?这将解决你的问题。
更新
添加额外代码后。。。您应该将您的UNIQUE Key Identifier设置为ID Number,而不是ABC字段名称(无论您怎么称呼它(