Szukałem rozwiązania tego problemu w Internecie i sprawdzałem pytania Stack Overflow, ale żadne z rozwiązań nie działało w moim przypadku.
Chcę utworzyć klucz obcy z tabeli sira_no do metal_kod.
ALTER TABLE sira_no
ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
REFERENCES metal_kod(METAL_KODU)
ON DELETE SET NULL
ON UPDATE SET NULL ;
Ten skrypt zwraca:
Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)
Próbowałem dodać indeks do wskazanej tabeli:
CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);
Sprawdziłem METAL_KODU na obu tabelach (zestaw znaków i sortowanie), ale nie mogłem znaleźć rozwiązania tego problemu. Jak mogę rozwiązać ten problem?
Oto tabela metal_kod:
METAL_KODU varchar(4) NO PRI
DURUM bit(1) NO
METAL_ISMI varchar(30) NO
AYAR_YOGUNLUK smallint(6) YES 100
mysql
foreign-keys
mysql-error-1005
lamostreta
źródło
źródło
metal_kod
tabeli ... do którego pola w tej tabeli powinien odnosić się klucz obcy?Odpowiedzi:
Kod błędu: 1005 - w kodzie znajduje się nieprawidłowe odwołanie do klucza podstawowego
Zwykle jest to spowodowane odwołaniem do pola klucza obcego, które nie istnieje. Możliwe, że popełniono błąd literowy lub sprawdź, czy powinien być taki sam, lub niezgodność typu pola. Pola połączone z kluczem obcym muszą dokładnie odpowiadać definicjom.
Niektóre znane przyczyny to:
INT(10)
kluczowym polem, musi byćINT(10)
również, a nieINT(11)
lubTINYINT
. Możesz chcieć potwierdzić rozmiar pola za pomocą,SHOW
CREATE
TABLE
ponieważ przeglądarka zapytań czasami wyświetla wizualnie tylkoINTEGER
dla obuINT(10)
iINT(11)
. Powinieneś także sprawdzić, czy jeden nie jest,SIGNED
a drugi jestUNSIGNED
. Obaj muszą być dokładnie tacy sami.MyISAM
stół. Aby używać kluczy obcych, obie tabele muszą byćInnoDB
. (Właściwie, jeśli obie tabele sąMyISAM
, nie otrzymasz komunikatu o błędzie - po prostu nie utworzy klucza). W przeglądarce zapytań możesz określić typ tabeli.ON
DELETE
SET
NULL
, ale odpowiednie pole klucza jest ustawione naNOT
NULL
. Możesz to naprawić, zmieniając kaskadę lub ustawiając pole, aby zezwolić naNULL
wartości.ALTER
instrukcji lub błędnie wpisałeś jedną z nazw pól w relacjiAby uzyskać więcej informacji, zobacz: Numer błędu MySQL 1005 Nie można utworzyć tabeli
źródło
SHOW ENGINE INNODB STATUS
jak wspomniano w tym pytaniu pomogło mi zdiagnozować mój konkretny problem (PEBCAK, w moim przypadku ...)set names 'utf8', storage_engine=MYISAM;
na początku skryptu rozwiązało problem za mnie. Dziękuję @ user319198 i @Stefano za wyczerpującą odpowiedź! : o)Może się to również zdarzyć podczas eksportowania bazy danych z jednego serwera na inny, a tabele są domyślnie wymienione w kolejności alfabetycznej.
Tak więc twoja pierwsza tabela może mieć klucz obcy innej tabeli, która nie została jeszcze utworzona. W takich przypadkach wyłącz Foreign_key_checks i utwórz bazę danych.
Po prostu dodaj do swojego skryptu:
i będzie działać.
źródło
Bardzo często dzieje się tak, gdy klucz obcy i klucz referencyjny nie mają tego samego typu lub tej samej długości.
źródło
Czasami jest to spowodowane usunięciem tabeli głównej (być może przez wyłączenie sprawdzania klucza obcego), ale klucz obcy CONSTRAINT nadal istnieje w innych tabelach. W moim przypadku upuściłem stół i próbowałem go odtworzyć, ale rzucał mi ten sam błąd.
Spróbuj więc usunąć wszystkie klucze obce CONSTRAINT ze wszystkich tabel, jeśli takie istnieją, a następnie zaktualizuj lub utwórz tabelę.
źródło
Miałem podobny błąd. Problem dotyczył tego, że tabela podrzędna i nadrzędna nie miały tego samego zestawu znaków i sortowania. Można to naprawić, dołączając ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
... w instrukcji SQL oznacza, że brakuje jakiegoś kodu.
źródło
Klucz obcy musi mieć dokładnie taki sam typ jak klucz podstawowy, do którego się odwołuje. Na przykład ma typ „INT UNSIGNED NOT NULL”, klucz foreing również musi mieć wartość „INT UNSIGNED NOT NULL”
źródło
Kod błędu: 1005
Miałem podobny problem, więc oto kilka rzeczy, które wypróbowałem (nie w dowolnej kolejności, z wyjątkiem rozwiązania :))
W końcu zobaczyłem, że mam otwartych dwóch edytorów. Jeden w PhpStorm (JetBrains) i drugi w Środowisku roboczym MySQL. Wygląda na to, że PhpStorm / MySQL Workbench tworzy pewnego rodzaju blokadę edycji.
Zamknąłem PhpStorm tylko po to, aby sprawdzić, czy istnieje blokowanie (mogło być na odwrót). To rozwiązało mój problem.
źródło
Otrzymałem ten sam komunikat o błędzie. W końcu zorientowałem się, że błędnie wpisałem nazwę tabeli w poleceniu:
przeciw
Zastanawiam się, dlaczego MySQL nie może powiedzieć, że taka tabela nie istnieje ...
źródło
Właśnie wspomniano o MyISAM. Po prostu spróbuj dodać ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; na końcu instrukcji, zakładając, że inne tabele zostały utworzone za pomocą MyISAM.
źródło
W moim przypadku stało się tak, gdy jeden stół to InnoB, a drugi to MyISAM. Zmiana silnika jednej tabeli, poprzez MySQL Workbench, rozwiązuje za mnie.
źródło
Stało się tak w moim przypadku, ponieważ nazwa tabeli, do której się odwołujemy w deklaracji ograniczenia, nie była poprawna (zapomniałem dużej litery w nazwie tabeli):
źródło
sprawdź, czy obie tabele mają ten sam schemat InnoDB MyISAM. Zrobiłem je wszystkie w moim przypadku InnoDB i działałem
źródło
Mój problem nie został wymieniony, to było coś tak głupiego ..... Tabela, która ma
FK
as PK była złożeniem,PK
które zostało zadeklarowane w następujący sposób: klucz podstawowy (CNPJ
,CEP
) Chciałem, aby pole CEP byłoFK
w innej tabeli i byłem utknąłem w tym błędzie, morał tej historii właśnie odwrócił powyższy kod dla klucza podstawowego (CEP
,CNPJ
) i zadziałało. Daj napiwek swoim znajomym.źródło