2012-12-07 38 views
0

我有不知何故以下列方式损坏数据库:
表A的记录在一个外键列指向表B的值,但没有这样的纪录B.
的存在数据库是在h2版本1.3.152中创建的,我用1.3.170恢复了它(本文最新)。
奇怪的是,恢复工具没有抱怨这个(但问题没有解决)
任何想法为什么/如何发生这种情况?
任何想法如何恢复?参照完整性破碎

实际例子:

SELECT * FROM PUNTO其中punto_id = 3309; - >不返回任何东西

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

punto.punto_id引用tramo.caseta_punto_id

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

谢谢。

回答

0

数据库实际上与H2版本1.2.140,从2010年创建(在“CREATE_BUILD”数据库文件设置为140,这意味着版本1.2.140使用。)

这是相当难说如何违反参照完整性。数据库损坏时可能会发生此问题,或者在referential integrity was disabled(如果它曾经被禁用)时可能发生了此问题。

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

有多种方法可以解决参考完整性问题。一个解决方案是删除多余的记录,另一个是添加缺少的记录。我目前没有自动化的方法来解决它们。

+0

谢谢托马斯花时间回答。对于关于版本的错误信息抱歉。它让我担心db可能会以这种方式默默地结束。在运行时查询开始失败时发现该问题。我无法手动修复该问题(设置为空fk columnd并重新插入缺失的记录),直到我重新启动数据库。某事正在锁定这件事。 – pakman

+0

它也让我感到担忧......不幸的是,我不能说出是什么原因导致了参照完整性被破坏。这可能是参考完整性被手动禁用,我想你没有那样做?过去,在版本1.2.140和现在之间,存储引擎级别上存在一些可能导致索引损坏的错误(有关详细信息,请参阅更改日志)。不是很多,而且现在已经修好了,但这可能是原因。我目前正在研究一种新的,更简单的存储引擎。这应该可以降低存储引擎级错误的风险。 –