sql server-无法插入重复的关键字sql


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
正如Yaakov Ellis所说。。。

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

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

具有唯一Id的1、2和3

因此,如果你想替换它们,而不是字符串插入它们已经存在的地方,并生成错误。

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

更新

添加额外代码后。。。您应该将您的UNIQUE Key Identifier设置为ID Number,而不是ABC字段名称(无论您怎么称呼它(

最新更新