Jak naprawić błąd MySQL nie może dodać ograniczenia klucza obcego?

Opublikowany: 2022-12-22

Jak naprawić błąd „ MySQL nie może dodać ograniczenia klucza obcego ”? Podczas próby dodania ograniczenia klucza obcego do tabeli MySQL może pojawić się następujący komunikat o błędzie: „ BŁĄD 1215 (HY000): Nie można dodać ograniczenia klucza obcego ”.

Taki błąd jest bardzo ogólny i nie zawiera szczegółowych informacji dotyczących konkretnego powodu, dla którego MySQL nie może wstawić ograniczenia klucza obcego do tabeli. Aby rozwiązać ten problem, musisz określić dokładną przyczynę problemu.

W tym artykule wyjaśniono przyczynę błędu MySQL „#1215 – Cannot Add Foreign Key Constraint”, jak znaleźć przyczynę i jak to naprawić czterema skutecznymi metodami.

Jak naprawić błąd MySQL nie może dodać ograniczenia klucza obcego?

Jaki jest powód błędu MySQL „#1215 – Nie można dodać ograniczenia klucza obcego”?

Ten błąd może mieć różne przyczyny. Aby ustalić przyczynę tego błędu, najlepiej przejrzeć sekcję NAJNOWSZY BŁĄD KLUCZA ZAGRANICZNEGO w POKAŻ STAN INNODB ENGINE.

W ten sposób zyskasz lepsze zrozumienie problemu. Będziesz mógł zidentyfikować swoją sprawę z poniższej listy:

Zwykle podczas ładowania zrzutów tabela lub indeks, do którego odnosi się ograniczenie, nie istnieje

Czasami tabela bazy danych, którą klienci chcą dodać, nie istnieje, co powoduje wyświetlenie komunikatu o błędzie 1215.

Jednak nic nie wskazuje na to, że tabela nie istnieje, dlatego zaleca się użycie komendy w celu określenia, które tabele są dostępne w bazie danych.

Uruchom SHOW TABLES lub SHOW CREATE TABLE na każdej z tabel nadrzędnych. Każda tabela, która zwraca błąd 1146, wskazuje, że tabele zostały utworzone w nieprawidłowej kolejności.

Rozwiązaniem jest uruchomienie brakującego polecenia CREATE TABLE i ponowna próba lub tymczasowe wyłączenie sprawdzania klucza obcego. Konieczne jest wykonanie tego kroku podczas przywracania kopii zapasowych, w których mogą występować odwołania cykliczne.

Uruchom następujący kod, aby naprawić błąd:

 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS; SET FOREIGN_KEY_CHECKS=0; SOURCE /backups/mydump.sql; -- restore your backup within THIS session SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;

Tabele lub indeksy w cudzysłowach odnoszących się do nadużyć związanych z ograniczeniami

Jeśli chcesz zdiagnozować ten błąd, sprawdź każdą deklarację KLUCZA OBCYEGO i upewnij się, że nie ma cudzysłowów wokół kwalifikatorów obiektów lub że wokół tabeli znajdują się cudzysłowy, a nazwy każdej kolumny po jednej parze.

Można to rozwiązać, nie cytując niczego lub cytując osobno tabelę i kolumnę.

Klucz lokalny, obca tabela lub kolumna w odniesieniach do ograniczeń zawiera literówkę

Można zdiagnozować ten błąd, uruchamiając polecenia SHOW TABLES i SHOW COLUMNS i porównując ciągi znaków z podanymi w deklaracji REFERENCJE. Literówka powinna zostać poprawiona natychmiast po jej wykryciu.

Kolumna, do której odnosi się ograniczenie, nie jest tego samego typu ani szerokości co kolumna obca

Do diagnozy użyj elementu nadrzędnego SHOW CREATE TABLE, aby upewnić się, że kolumna lokalna i kolumna, do której następuje odwołanie, zawierają ten sam typ danych i szerokość.

Problem można rozwiązać, edytując instrukcję DDL, aby upewnić się, że definicja kolumny w tabeli podrzędnej jest zgodna z definicją w tabeli nadrzędnej.

Obcy przedmiot nie jest KLUCZEM jakiegokolwiek rodzaju

Aby zdiagnozować ten problem, użyj elementu nadrzędnego SHOW CREATE TABLE, aby sprawdzić część REFERENCJE tabeli, aby upewnić się, że kolumna, która ją wskazuje, nie jest indeksowana.

Rozwiąż problem, ustawiając kolumnę jako KLUCZ, KLUCZ UNIKALNY lub KLUCZ PODSTAWOWY.

Klucz obcy to wielokolumnowy PK lub UK, gdzie kolumna, do której się odwołuje, nie jest najbardziej wysuniętą na lewo

Aby zdiagnozować ten błąd, wykonaj polecenie nadrzędne SHOW CREATE TABLE, aby określić, czy część REFERENCES wskazuje na kolumnę, która jest obecna w niektórych indeksach wielokolumnowych, ale nie jest najbardziej wysunięta na lewo w swojej definicji.

Możesz rozwiązać ten problem, dodając indeks do tabeli nadrzędnej, w której kolumna, do której się odwołuje, jest kolumną najbardziej wysuniętą na lewo lub jedyną kolumną.

Różne zestawy znaków/zestawienia między dwiema tabelami/kolumnami

Aby zdiagnozować problem, uruchom komendę SHOW CREATE TABLE parent i sprawdź, czy części CHARACTER SET i COLLATE kolumny podrzędnej pasują do części tabeli nadrzędnej.

Aby to naprawić, upewnij się, że tabela podrzędna DDL pasuje do zestawu znaków i sortowania tabeli/kolumny nadrzędnej lub ZMIEŃ tabelę nadrzędną, aby jej definicja była zgodna z definicją podrzędną.

Tabela nadrzędna nie używa InnoDB

Problem można zdiagnozować, uruchamiając rodzica SHOW CREATE TABLE i sprawdzając, czy ENGINE=INNODB.

ZMIEŃ tabelę nadrzędną, aby przełączyć się z MySQL na InnoDB, aby rozwiązać ten problem.

Jak znaleźć przyczynę błędu „Nie można dodać ograniczenia klucza obcego”?

Ten błąd nie wskazuje konkretnej przyczyny niezdolności MySQL do zaimplementowania ograniczenia klucza obcego w tabeli, co jest bardzo ogólne.

Aby rozwiązać ten problem, musisz zidentyfikować dokładną przyczynę. Możesz to zrobić, uruchamiając następujące zapytanie w swoim kliencie MySQL:

 SHOW ENGINE INNODB STATUS;

Z tego zapytania mają zostać zwrócone trzy pola: Typ, Nazwa i Status. NAJNOWSZY BŁĄD KLUCZA OBCYEGO można zidentyfikować, rozwijając kolumnę stanu wyniku.

Ta sekcja ma na celu określenie, dlaczego ostatnie zapytanie alter nie powiodło się, aby można było rozwiązać problem.

Zwykle przyczyną tego problemu jest niezgodność między typem kolumn w tabeli podstawowej i tabeli obcej.

Problem może być również spowodowany niezgodnością między dwoma typami silników tabel, takimi jak MyISAM i InnoDB.

Jest to również możliwe dzięki różnym zestawieniom między tabelami, z których jedna używa UTF-8, a druga używa latin1.

Należy zwrócić uwagę na następujące czynniki:

Silnik : Każda tabela powinna być skonfigurowana z tym samym silnikiem bazy danych, na przykład InnoDB.

Typ danych : w jednej tabeli obie kolumny powinny mieć ten sam „ datatype. int(11) datatype. int(11) ”, podczas gdy w innym smallint(5) spowoduje problem.

Sortowanie : Aby zapewnić kompatybilność, zestawy znaków obu kolumn powinny być takie same, np. UTF8.

Uważaj : Kolumny nadal mogą mieć inną, nawet jeśli Twoje tabele mają to samo zestawienie.

Unikalny : Klucze obce powinny odnosić się do unikalnych pól w tabeli referencyjnej, zwykle podstawowych.

Ungisned : Możliwe jest, że jedna tabela ma niepodpisane klucze, a inna nie ma żadnych niepodpisanych kluczy.

Jak naprawić błąd MySQL „# 1215 – Nie można dodać ograniczenia klucza obcego” (4 metody)?

Po omówieniu różnych przyczyn tego komunikatu o błędzie przeszliśmy do następnego kroku. Ten błąd musi zostać naprawiony, więc zobaczmy, jak to zrobić za pomocą czterech skutecznych metod.

Metoda 1: Sprawdź dostępność stołu

Aby rozpocząć rozwiązywanie problemu z błędem, możesz sprawdzić, czy tabela istnieje, uruchamiając następujące polecenie:

 show tables;

Z tego kodu wynika, że ​​ograniczenie mogło zostać utworzone, ponieważ tabela była dostępna.

Metoda 2: Upewnij się, że tabela nadrzędna używa InnoDB

Dalsze badanie można przeprowadzić, sprawdzając silnik pamięci masowej ustawiony na tabelę bazy danych. W tym celu można użyć następującego polecenia:

 SHOW CREATE TABLE parent

W rezultacie przekonasz się, że InnoDB nie jest silnikiem pamięci masowej. Ponieważ ustawiono ENGINE=MYISAM, możesz zmienić mechanizm przechowywania, uruchamiając następujące polecenie:

 ALTER TABLE parent ENGINE=INNODB;

W końcu możliwe jest naprawienie błędu za pomocą tej metody.

Metoda 3: Sprawdź, czy nie ma nieodpowiednich cytatów

Dla każdej deklaracji KLUCZA OBCEGO upewnij się, że kwalifikatory obiektów nie są otoczone cudzysłowami lub że nazwy tabel i kolumn są otoczone osobnymi cudzysłowami.

W przypadku tej metody konieczne jest albo niecytowanie czegokolwiek, albo zacytowanie kolumny i tabeli osobno, aby naprawić błąd.

Metoda 4: Weryfikacja, czy klucz istnieje, czy nie

Podczas wprowadzania poleceń MySQL należy upewnić się, że wprowadzone zostało prawidłowe polecenie. Kontrola krzyżowa zapewnia, że ​​klient nie odwołuje się do nieistniejącego klucza tabeli w tabeli docelowej.

Dlatego konieczne jest poprawienie klientów, jak używać klucza na stole. Możliwe, że w niektórych przypadkach kolumna używana dla ON DELETE SET NULL nie ma definicji null.

Aby zapobiec błędowi MySQL 1215, musisz upewnić się, że kolumna jest ustawiona na domyślną wartość null.

Wniosek

W tym artykule wyjaśniono przyczynę błędu MySQL „#1215 – Cannot Add Foreign Key Constraint”, jak znaleźć przyczynę i jak ją naprawić czterema skutecznymi metodami.

Dziękujemy za poświęcenie czasu na przejrzenie tego artykułu. Mamy przyjemność zaprezentować go Państwu. W sekcji komentarzy prosimy o zamieszczanie pytań lub komentarzy.

Jeśli chcesz być na bieżąco z najnowszymi wiadomościami, polub i śledź nasze strony na Facebooku i Twitterze.