Ссылочная целостность нарушена

У меня есть база данных, которая каким-то образом была повреждена следующим образом:
Запись в таблице A имеет значение в столбце внешнего ключа, указывающего на таблицу B, но такой записи нет в B.
БД была создана в h2 версии 1.3.152, и я восстановил его с помощью 1.3.170 (последняя на момент написания этого поста).
Также странно, что инструмент восстановления не жаловался на это (но проблема не была решена)
Есть идеи, почему/как это произошло?
Есть идеи, как восстановить?

Фактический пример:

выберите * из punto, где punto_id = 3309; --> ничего не возвращает

выберите * из трамо, где caseta_punto_id = 3309; --> возвращает 1 запись

punto.punto_id ссылается на Tramo.caseta_punto_id

Вы можете загрузить копию базы данных здесь.

Спасибо.


person pakman    schedule 07.12.2012    source источник


Ответы (1)


Фактически база данных была создана с помощью H2 версии 1.2.140 от 2010 года. (Настройка CREATE_BUILD в файле базы данных равна 140, что означает, что используется версия 1.2.140.)

Трудно сказать, как была нарушена ссылочная целостность. Проблема могла возникнуть при повреждении базы данных или при отключенной ссылочной целостности (если он когда-либо был отключен).

инструмент восстановления предназначен для восстановления как можно большей части данных в базе данных. файл, насколько это возможно. Это не устраняет проблемы ссылочной целостности.

Существует несколько способов исправить проблемы с ссылочной целостностью. Одно решение — удалить лишние записи, другое — добавить отсутствующие записи. Однако в настоящее время у меня нет автоматического способа исправить их.

person Thomas Mueller    schedule 10.12.2012
comment
Спасибо, Томас, что нашли время ответить. Извините за дезинформацию о версии. Меня беспокоит, что таким образом БД может быть тихо свернута. Проблема была обнаружена во время выполнения, когда запрос начал давать сбой. Я не мог вручную исправить проблему (обнуление столбца fk и повторная вставка отсутствующих записей), пока я не перезапустил db. Что-то запирало эту штуку. - person pakman; 11.12.2012
comment
Меня это тоже беспокоит... К сожалению, я не могу сказать, в чем причина нарушения ссылочной целостности. Возможно, ссылочная целостность была отключена вручную, я думаю, вы этого не сделали? В прошлом, между версией 1.2.140 и настоящей, были некоторые ошибки на уровне механизма хранения, которые могли привести к повреждению индексов (подробности см. в журнале изменений). Не так много, и они сейчас исправлены, но это могло быть причиной. В настоящее время я работаю над новым, более простым механизмом хранения. Это должно снизить риск ошибок на уровне механизма хранения. - person Thomas Mueller; 12.12.2012