【发布时间】:2020-04-22 14:25:16
【问题描述】:
我从具有由 2 个列值组成的聚集主键的表中删除了 100 行(共 500 行)。 WHERE 子句使用的列不在任何键或索引中。
DELETE myTABLE WHERE data1='0'
这些行被删除了,我运行了一个查询来检查自己。
但是,我尝试使用...将行重新插入 myTABLE 中。
INSERT INTO myTABLE (pkval1, pkval2, data1, data2)
SELECT srcVal1, srcVal2, srcData1, srcData2
FROM mySourceTable
在mySourceTable 中,srcVal 和srcVal2 列形成唯一索引,但不是主键。
结果是一个错误:
违反主键约束“PK_MYTABLE”无法在对象“dbo.myTable”中插入重复键。重复的键值是 {a value in srcVal2}
我查看了mySourceTable 中的所有关键值,它们都是有效的。
问题:如果我删除了这些行,为什么我不能重新插入它们?
在多年的 SQL 编程中,我从未遇到过这个问题。但我累了,我敢肯定我对一些简单的事情视而不见。
【问题讨论】:
-
您是否为此列设置了身份规范?
-
这是唯一索引的第二部分。 srcVal1 + srcVal2
-
不可能。主键违规错误消息将包含重复的完整元组。 Example.
-
我打错了... srcVal1 和 srcVal2 是唯一索引,而不是主键。
-
如果您从 500 行的表中删除了 100 行,则还剩下 400 行。剩下的 400 行之一的值与您尝试插入的新值冲突。
标签: sql sql-server primary-key