2
insert into A (id,Name)
select ti.id,ti .Name 
from A ti 
where ti.id >= 1 AND ti.id<=3

id是主键但不是自动生成的。当我运行查询时出现错误

违反主键约束“XPKA”。无法在对象“dbo.A”中插入重复键

表A

id Name
1   A
2   B
3   C

我想插入

id Name
4   A
5   B
6   C
4

4 回答 4

4

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

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

于 2013-02-25T14:26:08.670 回答
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
于 2013-02-25T14:27:53.537 回答
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
于 2013-02-25T15:43:58.787 回答
0

正如 Yaakov Ellis 所说...

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

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

具有唯一 ID 1、2 和 3 的人

因此,如果您想替换那些而不是尝试在它们已经存在的地方插入它们并生成错误。

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

更新

添加额外代码后...您应该将 UNIQUE Key Identifier 设置为 ID 号而不是 ABC 字段名称(无论您如何称呼它)

于 2013-02-25T14:28:51.310 回答