重新插入以前删除的行时 SQL SERVER 2017 主键冲突

Posted

技术标签:

【中文标题】重新插入以前删除的行时 SQL SERVER 2017 主键冲突【英文标题】:SQL SERVER 2017 primary key violation when re-inserting a previously deleted row 【发布时间】: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 行之一的值与您尝试插入的新值冲突。 【参考方案1】:

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

【讨论】:

以上是关于重新插入以前删除的行时 SQL SERVER 2017 主键冲突的主要内容,如果未能解决你的问题,请参考以下文章

sql插入数据后怎么覆盖以前的?? 比如数据库有123数据、我重新插入123时。123变成别的数字。。

UITableView 负顶部内容插入导致重新排序行时出现故障

跨部分重新排序行时更新无效

SQL Server - 在模式中触发AFTER INSERT表

SQL Server学习笔记——简单增删改

SQL Server学习笔记——简单增删改