无法在具有唯一索引的对象中插入重复的键行

Posted

技术标签:

【中文标题】无法在具有唯一索引的对象中插入重复的键行【英文标题】:Cannot insert duplicate key row in object with unique index 【发布时间】:2014-03-05 21:29:37 【问题描述】:

我正在尝试运行以下查询:

update OAR.oa_AcademicHead
set  personid=15857
where personid=1234

但我收到了错误:

Cannot insert duplicate key row in object 'OAR.oa_AcademicHead' with unique index 'IX_oa_AcademicHead_personid'.
The statement has been terminated.

有什么办法可以解决这个问题??

【问题讨论】:

为什么要更改行的主 ID。是不是违反了任何数据库完整性原则? 也许你只是想删除1234?我对人们相互融合的想法非常着迷。 【参考方案1】:

表中已存在personid15857 的行。该列上的唯一索引阻止您提交具有相同 personid 的另一条记录(更新实际上是删除和插入)。

在运行查询之前,您必须先删除具有该 ID 的现有人员。*

* 免责声明:确保这确实是您想要做的;注意它可能导致的问题。

【讨论】:

给定表中只有一行 personid 为 15857,personid 是其他表的外键,表的主键是 Academicheadid。为什么我们不能有两行具有相同的人员 ID。另外,我无法删除 ID 1234 的人,因为他也是其他组织的学者。所以,如果我删除 1234,关于是 AH 状态的信息将会丢失。还有什么可以解决的?谢谢。 索引IX_oa_AcademicHead_personid被指定为唯一索引,这意味着表中的每个personid都必须是唯一的;不能有重复。作为外键的“其他表”听起来像“人员”表。在现实中,两个不同的学术负责人不可能是同一个人,因此有唯一的索引。如果没有看到整个数据库架构,就很难提出行动方案。【参考方案2】:

我知道这个问题真的很老了。但仍然可能会有所帮助。

我的数据库遇到了这个问题,经过几个小时的努力,我设法解决了这个问题。

我的数据库有一个Attachments 表,它有主键ID。我也有messageID 列,无法创建具有相同messageID 的两行。我发现messageID 是索引器。我不知道索引器到底是做什么用的,但我只是删除了索引器,现在它可以正常工作了。

【讨论】:

【参考方案3】:

如果您在使用 ASP.NET MVC 时遇到上述错误,请执行以下操作:

db.Entry(personObject).State = EntityState.Modified;
db.Entry(personObject).Property(x => x.personid).IsModified = false;
db.SaveChanges();

【讨论】:

【参考方案4】:

如果您的模型使用 [Index(nameof(SomeForeignKey), nameof(SomeOtherForeignKey), IsUnique = true)] 之类的索引器进行修饰,那么您将应对诸如此类的问题, 比如“更新条目时发生错误。有关详细信息,请参阅内部异常。”

【讨论】:

以上是关于无法在具有唯一索引的对象中插入重复的键行的主要内容,如果未能解决你的问题,请参考以下文章

具有过滤索引的实体框架 - “无法在对象中插入重复的键行”

SQLSTATE[23000]:无法在对象中插入重复的键行

在具有标识列的表中插入 select from

EF6 无法插入重复的键行

MySQL处理重复键错误插入具有多个唯一索引的表;不是多列唯一索引

唯一索引与主键索引的比较