参照完整性被破坏

Posted

技术标签:

【中文标题】参照完整性被破坏【英文标题】:Referential Integrity Broken 【发布时间】:2012-12-07 22:17:30 【问题描述】:

我有一个数据库以某种方式被以下方式损坏: 表 A 中的记录在指向表 B 的外键列中有值,但 B 中不存在该记录。 该数据库是在 h2 版本 1.3.152 中创建的,我使用 1.3.170 恢复了它(在本文发布时最新)。 也很奇怪,恢复工具没有抱怨这个(但问题没有解决) 关于为什么/如何发生这种情况的任何想法? 关于如何恢复的任何想法?

实际例子:

select * from punto where punto_id = 3309; --> 不返回任何东西

select * from tramo where caseta_punto_id = 3309; --> 返回 1 条记录

punto.punto_id 引用tramo.caseta_punto_id

您可以下载数据库here的副本。

谢谢。

【问题讨论】:

【参考方案1】:

数据库实际上是从 2010 年开始使用 H2 版本 1.2.140 创建的。(数据库文件中的 'CREATE_BUILD' 设置为 140,即使用版本 1.2.140。)

很难说参照完整性是如何受到侵犯的。问题可能在数据库损坏时发生,或者在 referential integrity was disabled 时发生(如果它曾经被禁用)。

recover tool 旨在尽可能多地恢复数据库文件中的数据。它不能解决参照完整性问题。

有多种方法可以解决参照完整性问题。一种解决方案是删除多余的记录,另一种是添加缺失的记录。但是,我目前没有自动修复它们的方法。

【讨论】:

感谢 Thomas 抽出宝贵时间回答。对于版本的错误信息,我们深表歉意。我担心数据库会以这种方式悄无声息地被破坏。该问题是在运行时查询开始失败时发现的。在我重新启动数据库之前,我无法手动解决该问题(将 fk 列设置为空并重新插入丢失的记录)。有什么东西把它锁起来了。 这也让我担心......不幸的是,我不知道引用完整性被破坏的原因是什么。可能是手动禁用了参照完整性,我猜你没有这样做?过去,从版本 1.2.140 到现在,存储引擎级别存在一些可能导致索引损坏的错误(有关详细信息,请参阅更改日志)。不是很多,而且它们现在已修复,但这可能是原因。我目前正在研究一种新的、更简单的存储引擎。这应该可以降低存储引擎级别的错误风险。

以上是关于参照完整性被破坏的主要内容,如果未能解决你的问题,请参考以下文章

完整性约束语法定义

参照完整性-外键约束

mysql参照完整性 策略设置之 on update 和 on delete

9.数据库-查-多表操作

完整性,模式,建表,建索引

Django ForeignKey不需要参照完整性?