Как искать нарушения внешнего ключа во всей базе данных? (В настоящее время я использую MySQL) - PullRequest
4 голосов
/ 05 октября 2009

В базах данных, где проверка внешнего ключа была отключена в прошлом, как можно проверить нарушения ограничения внешнего ключа ?

Ответы [ 5 ]

2 голосов
/ 10 января 2012

Как правило, если у вас нет ограничений по внешнему ключу, вы можете сделать это:

SELECT * FROM CHILD C WHERE C.PARENT_ID NOT IN (SELECT ID FROM PARENT);
0 голосов
/ 10 октября 2009

Похоже, вы могли бы перефразировать ваш вопрос как "Как я могу обеспечить ссылочную целостность при отключенных внешних ключах?"

Я предполагаю, что те самые "головные боли", которые заставили вас отключить внешние ключи, - это то, что они должны были применять. Таким образом, самый простой ответ для меня, кажется, не отключить их в первую очередь. Сделайте это правильно в первый раз, и вам больше не придется делать это позже.

0 голосов
/ 05 октября 2009

нет встроенного способа сделать это. единственное, о чем я могу думать, - это посмотреть на таблицы TABLE_CONSTRAINTS и KEY_COLUMN_USAGE в базе данных INFORMATION_SCHEMA, чтобы вручную проверить строки, которые не совпадают.

0 голосов
/ 05 октября 2009

«Включение» FK после загрузки действительно должно выполнить проверку.

Если ваша СУБД этого не делает, выбросьте ее.

Если ваша СУБД этого не делает и вы все еще хотите продолжать работать с таким дерьмом, вы можете выполнить запрос соответствующего выражения SEMIMINUS для RA.

Это может выглядеть примерно так:

ВЫБРАТЬ ... FROM table_with_FK ГДЕ НЕ СУЩЕСТВУЕТ ( ВЫБРАТЬ ... FROM table_with_PK ГДЕ PK_attribute1 = FK_attribute1 и PK_attribute2 = FK_attribute2 и ... ) И <все, что позволяет идентифицировать загруженные строки>

или чуть более современно (если ваша СУБД поддерживает EXCEPT):

SELECT FK_attributes FROM table_with_FK ГДЕ <все, что позволяет идентифицировать загруженные строки> КРОМЕ ВЫБЕРИТЕ PK_attributes_possbly_renamed FROM table_with_PK ;

РЕДАКТИРОВАТЬ (отвечая на вопрос: «Не всем нужны продукты Oracle и IBM». «Отбрасывать это» - не очень хороший совет.)

ОП очень четко указал, что он ОПРЕДЕЛЕННО заинтересован в целостности данных. Поэтому он действительно должен использовать продукт СУБД, который предлагает небольшую поддержку профессионального уровня для обеспечения целостности данных. Я искренне надеюсь, что «продукты Oracle и IBM» не единственные, кто это делает.

0 голосов
/ 05 октября 2009

Включение ограничения внешнего ключа проверит все отношения, поэтому, если что-то не так, вы получите ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...