【问题标题】:SQL SERVER 2017 primary key violation when re-inserting a previously deleted row重新插入以前删除的行时 SQL SERVER 2017 主键冲突
【发布时间】: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 中,srcValsrcVal2 列形成唯一索引,但不是主键。

结果是一个错误:

违反主键约束“PK_MYTABLE”无法在对象“dbo.myTable”中插入重复键。重复的键值是 {a value in srcVal2}

我查看了mySourceTable 中的所有关键值,它们都是有效的。

问题:如果我删除了这些行,为什么我不能重新插入它们?

在多年的 SQL 编程中,我从未遇到过这个问题。但我累了,我敢肯定我对一些简单的事情视而不见。

【问题讨论】:

  • 您是否为此列设置了身份规范?
  • 这是唯一索引的第二部分。 srcVal1 + srcVal2
  • 不可能。主键违规错误消息将包含重复的完整元组。 Example.
  • 我打错了... srcVal1 和 srcVal2 是唯一索引,而不是主键。
  • 如果您从 500 行的表中删除了 100 行,则还剩下 400 行。剩下的 400 行之一的值与您尝试插入的新值冲突。

标签: sql sql-server primary-key


【解决方案1】:

问题出在 mySourceTable 中。虽然 srcVal1+srcVal2 产生了唯一的索引值,但 myTABLE 中的 pkval2 上有一个唯一的索引。只见树木不见森林。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多