Mam dwie tabele, table1
to tabela nadrzędna z kolumnąID
i table2
z kolumny IDFromTable1
(nie rzeczywista nazwa), kiedy kładę FK na IDFromTable1
celu ID
w table1
pojawia się błąd Foreign key constraint is incorrectly formed error
. Chciałbym usunąć rekord tabeli 2, jeśli table1
zostanie usunięty. Dzięki za wszelką pomoc
ALTER TABLE `table2`
ADD CONSTRAINT `FK1`
FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`)
ON UPDATE CASCADE
ON DELETE CASCADE;
Daj mi znać, jeśli potrzebujesz innych informacji. Jestem nowy w mysql
table2.IDFromTable1
itable1.ID
?Odpowiedzi:
Napotkałem ten sam problem z HeidiSQL. Otrzymany błąd jest bardzo tajemniczy. Mój problem polegał na tym, że kolumna klucza obcego i kolumna odwołująca się nie były tego samego typu lub długości.
Kolumna klucza obcego to,
SMALLINT(5) UNSIGNED
a kolumna, do której się odwołuje - toINT(10) UNSIGNED
. Kiedy utworzyłem dla obu dokładnie ten sam typ, tworzenie klucza obcego działało idealnie.źródło
Miałem ten sam problem podczas tworzenia tabeli nadrzędnej za pomocą
MyISAM
silnika. To głupi błąd, który naprawiłem:źródło
upewnij się, że kolumny są identyczne (tego samego typu), a jeśli kolumna odniesienia nie jest
primary_key
, upewnij się, że takINDEXED
.źródło
KEY referencing_column(referencing_column)
PRZED definicją obu kluczy obcych zostały one dodane pomyślnie :)Składnia definiowania kluczy obcych jest bardzo wyrozumiała, ale dla każdego, kto się o to potyka, fakt, że klucze obce muszą być „tego samego typu” dotyczy nawet sortowania, a nie tylko typu i długości danych oraz podpisywania bitów.
Nie żebyś mieszał sortowanie w swoim modelu (prawda?), Ale jeśli to zrobisz, upewnij się, że pola klucza podstawowego i obcego mają ten sam typ sortowania w phpmyadmin lub Heidi SQL lub czymkolwiek innym.
Mam nadzieję, że zaoszczędzi to czterech godzin prób i błędów, które mnie to kosztowało.
źródło
COLLATE utf8mb4_unicode_ci
mój (nieoczekiwany) problem (na maszynie deweloperskiej).Miałem ten sam problem, ale rozwiązałem go.
Tylko upewnij się, że kolumna „ID” w „tabeli1” ma UNIKATOWY indeks!
Oczywiście typ i długość kolumn „ID” i „IDFromTable1” w tych dwóch tabelach muszą być takie same. Ale już o tym wiesz.
źródło
Tylko do ukończenia.
Ten błąd może również wystąpić, jeśli masz klucz obcy z VARCHAR (..) i zestaw znaków w tabeli, do której się odwołuje, różni się od tabeli, do której się odwołuje.
np. VARCHAR (50) w tabeli Latin1 różni się od VARCHAR (50) w tabeli UTF8.
źródło
teksty błędów mysql nie pomagają tak bardzo, w moim przypadku kolumna miała ograniczenie „not null”, więc ustawienie „on delete set null” nie było dozwolone
źródło
jeśli wszystko jest w porządku, po prostu dodaj
->unsigned();
na końcuforegin key
.jeśli to nie zadziała, sprawdź typ danych obu pól. muszą być takie same.
źródło
Miałem ten sam problem, obie kolumny miały wartość INT (11) NOT NULL, ale nie mogę utworzyć klucza obcego. Musiałem wyłączyć sprawdzanie kluczy obcych, aby go pomyślnie uruchomić:
Mam nadzieję, że to komuś pomoże.
źródło
Jeszcze jedna prawdopodobna przyczyna wyświetlenia tego błędu. Kolejność, w jakiej tworzyłem tabele, była nieprawidłowa. Próbowałem odwołać się do klucza z tabeli, która nie została jeszcze utworzona.
źródło
(Ostatnio ponownie wysłane) Nawet jeśli nazwa pola i typ danych są takie same, ale sortowanie nie jest takie samo, spowoduje to również ten problem.
Na przykład
Spróbuj zmienić to na
....
To zadziałało dla mnie.
źródło
Sprawdź silnik tabel, oba tabele muszą być tym samym silnikiem, który tak bardzo mi pomógł.
źródło
SHOW TABLE STATUS LIKE 'table_name';
Miałem te same problemy.
Problem polega na tym, że kolumna odniesienia nie jest kluczem podstawowym.
Niech to będzie klucz podstawowy, a problem zostanie rozwiązany.
źródło
Chociaż inne odpowiedzi są dość pomocne, chciałem również podzielić się moim doświadczeniem.
Napotkałem problem, gdy usunąłem tabelę, do której
id
odwoływałem się już jako klucz obcy w innych tabelach ( z danymi ) i próbowałem odtworzyć / zaimportować tabelę z kilkoma dodatkowymi kolumnami.Zapytanie o odtworzenie (wygenerowane w phpMyAdmin) wyglądało następująco:
Jak możesz zauważyć,
PRIMARY KEY
indeks został ustawiony po utworzeniu ( i wstawieniu danych ), które powodowało problem.Rozwiązanie
Rozwiązaniem było dodanie
PRIMARY KEY
indeksu w zapytaniu definiującym tabelę dla tego, doid
którego odwoływano się jako klucz obcy, jednocześnie usuwając go zALTER TABLE
części, w której ustawiane były indeksy:źródło
Straciłem przez to wiele godzin!
PK w jednym stole był
utf8
w drugimutf8_unicode_ci
!źródło
Spróbuj wykonać następujące czynności:
źródło
Miałem ten sam problem z Symfony 2.8.
Nie dostałem tego na początku, ponieważ nie było podobnych problemów z int długością kluczy obcych itp.
Wreszcie musiałem wykonać następujące czynności w folderze projektu. (Restart serwera nie pomógł!)
app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result
źródło
dzięki S Doerin:
„Tylko do uzupełnienia. Ten błąd może również wystąpić, jeśli masz klucz obcy z VARCHAR (..), a zestaw znaków w tabeli, do której się odwołuje, jest inny niż w tabeli, do której się odwołuje. Np. VARCHAR (50) w tabeli Latin1 to inny niż VARCHAR (50) w tabeli UTF8. "
Rozwiązałem ten problem, zmieniając rodzaj znaków w tabeli. kreacja ma latin1, a poprawna to utf8.
dodaj następną linię. DOMYŚLNY ZESTAW ZNAKÓW = utf8;
źródło
Miałem problemy z używaniem Alter table do dodania klucza obcego między dwiema tabelami, a pomogło mi upewnienie się, że każda kolumna, do której próbowałem dodać relację klucza obcego, została zindeksowana. Aby to zrobić w PHP myAdmin: Przejdź do tabeli i kliknij kartę struktury. Kliknij opcję indeksu, aby zindeksować żądaną kolumnę, jak pokazano na zrzucie ekranu:
Po zaindeksowaniu obu kolumn, do których próbowałem odwoływać się za pomocą moich kluczy obcych, udało mi się z powodzeniem użyć tabeli alter i utworzyć relację klucza obcego. Zobaczysz, że kolumny są indeksowane jak na poniższym zrzucie ekranu:
zwróć uwagę, jak kod_zip pojawia się w obu tabelach.
źródło
Musisz sprawdzić, czy oba są takie same we wszystkich swoich właściwościach, w tym w „Sortowaniu”
źródło
Używałem heidisql i rozwiązać ten problem miałem aby utworzyć indeks w tabeli odwołuje się wszystkie kolumny są odwoływać.
źródło
Właśnie teraz napotkałem ten sam problem. W moim przypadku wszystko, co musiałem zrobić, to upewnić się, że tabela, do której się odwołuję w kluczu obcym, musi zostać utworzona przed bieżącą tabelą (wcześniej w kodzie). Więc jeśli odwołujesz się do zmiennej (x * 5), system powinien wiedzieć, czym jest x (x musi być zadeklarowane we wcześniejszych wierszach kodu). To rozwiązało mój problem, mam nadzieję, że pomoże to komuś innemu.
źródło
Miałem ten sam problem z migracją Laravel 5.1 Schema Builder z MariaDB 10.1.
Problem polegał na tym, że
unigned
zamiastunsigned
(s
brakowało litery) wpisałem podczas ustawiania kolumny.Po naprawieniu błędu literówki został dla mnie naprawiony.
źródło
Nawet ja napotkałem ten sam problem z mysql i liquibase. A więc na tym polega problem: Tabela, z której chcesz odwołać się do kolumny innej tabeli, różni się albo w przypadku typu danych, albo pod względem rozmiaru typu danych.
źródło
Sprawdź, czy nazwa tabeli jest podana w odpowiedniej wielkości (jeśli nazwy tabel w bazie danych uwzględniają wielkość liter). W moim przypadku musiałem się zmienić
do
zwróć uwagę na
customer
zmianę naCUSTOMER
.źródło
Lub możesz użyć DBDesigner4, który ma interfejs graficzny do tworzenia bazy danych i łączenia ich za pomocą FK. Kliknij prawym przyciskiem myszy swoją tabelę i wybierz „Kopiuj tworzenie SQL tabeli”, co spowoduje utworzenie kodu.
źródło
To stary temat, ale coś odkryłem. Podczas budowania środowiska roboczego MySQL pobiera również relacje z drugiej tabeli. po prostu zostaw filary, do których się odnosisz. Wyczyść inne automatycznie dodane kolumny. To działa dla mnie.
źródło
Mój przypadek był taki, że miałem literówkę we wspomnianej kolumnie:
Komunikat o błędzie jest dość tajemniczy i próbowałem wszystkiego - weryfikowania typów kolumn, sortowania, silników itp.
Zajęło mi trochę czasu, zanim zanotowałem literówkę, a po naprawieniu wszystko działało dobrze:
źródło
W obliczu tego problemu pojawił się błąd, gdy umieściłeś klucz podstawowy w innym typie danych, takim jak:
Tabela 1:
Tabela 2:
typ danych dla id drugiej tabeli musi być przyrostem
źródło
Problem jest bardzo prosty do rozwiązania
np: masz dwie tabele z nazwami użytkowników i postami i chcesz utworzyć klucz obcy w tabeli postów i używasz phpMyAdmina
1) w tabeli postów dodaj nową kolumnę ( name : use_id | type : jak id w tabeli użytkownika | Length : jak id w tabeli użytkownika | Domyślnie : NULL | Atrybuty : unsigned | index: INDEX)
2) na karcie Struktura przejdź do widoku relacji ( Nazwa ograniczenia : automatycznie ustawiana przez phpmyAdmin | nazwa kolumny : wybierz identyfikator_użytkownika | tabela : użytkownicy | klucz : id, ...)
Po prostu został rozwiązany
źródło