2012-08-10 21 views
10

Mamy bazę danych z kilkuset tabel. Tabele korzystające z foreign_keys używają INNODB.MySQL znaleźć nieprawidłowe klucze obce

Czasami przesyłamy dane (poszczególne tabele przy użyciu mysqldump) między naszą bazą danych o programowaniu, scenariuszem i produkcją. mysqldump wyłącza sprawdzanie klucza obcego w celu ułatwienia importowania danych.

Z czasem niektóre nasze nieprodukcyjne bazy danych zawierają kilka osieroconych wpisów.

Chciałem napisać skrypt, który znajdowałby i wykrywał wszystkie nieprawidłowe (klucze wskazujące brakujące rekordy) klucze obce dla całej bazy danych MySQL.

Wiem, że mogę napisać zapytanie, aby sprawdzić każdą tabelę i przycisk jeden po drugim, ale myślałem, że może już istnieć narzędzie do tego.

Sprawdziłbym przed napisaniem takiego skryptu, aby sprawdzić, czy już tam jest.

Wyszukiwał google nieco ... zaskakująco nic nie znalazłem.

+0

Co masz na myśli, "nieważny"? Osierocone rekordy? tabele z FK, które wskazują tabele, które już nie istnieją? –

+0

Możesz mieć swoją bazę automatycznie to zrobić (w zależności od tego, jakiego silnika bazy danych używasz) i mieć go NA KASKADOWANIU, aby integralność referencyjna była zachowana. –

+0

Oprócz stefanów należy pamiętać, że można unieważnić dziecko lub zaktualizować je, nie trzeba go usuwać. – TomDunning

Odpowiedz

12

Jeśli dane są już i nie utworzyły ograniczenia FK lub kaskady dla kasowania rodzica wtedy po prostu chcesz:

SELECT * FROM children WHERE my_fk_id NOT IN (select id from parents); 
+1

'WYBIERZ t1. * Z tabeli 1 t1 LEWY POŁĄCZENIE tabela2 t2 WŁÓŻ t1.parent_id = t2.id GDZIE t2.id IS NULL' – DavidS

+0

@Isotop Dane już są, ale mamy już ograniczenia fk. –

+0

Doskonale nadaje się do wyszukiwania nieprawidłowych kluczy w tabeli. Jednak szukam narzędzia, aby znaleźć je dla wszystkich tabel w całej bazie danych. –

Powiązane problemy