Chcę dodać klucz obcy do tabeli o nazwie „katalog”.
ALTER TABLE katalog
ADD CONSTRAINT `fk_katalog_sprache`
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;
Gdy próbuję to zrobić, pojawia się następujący komunikat o błędzie:
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)
Błąd w stanie INNODB:
120405 14:02:57 Błąd ograniczenia klucza obcego tabeli mytable. # Sql-7fb1_7d3a:
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL:
Cannot resolve table name close to:
(`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL
Kiedy korzystam z tego zapytania, działa, ale ze złym działaniem „przy usuwaniu”:
ALTER TABLE `katalog`
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )
Obie tabele to InnoDB, a oba pola to „INT (11) nie null”. Używam MySQL 5.1.61. Próba uruchomienia tego zapytania ALTER za pomocą MySQL Workbench (najnowszego) na MacBooku Pro.
Tabela Utwórz instrukcje:
CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`AnzahlSeiten` int(4) unsigned NOT NULL,
`Sprache` int(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `katalogname_uq` (`Name`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$
CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Bezeichnung` varchar(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`),
KEY `ix_sprache_id` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
mysql
foreign-keys
frgtv10
źródło
źródło
SHOW CREATE TABLE
, mogę tylko zapytać - czy nazwa kolumny to naprawdę ID, wielkie litery?katalog
maint(11) unsigned
.sprache
nie mausigned
części, dlatego dwie kolumny nie są takie same.auto_increment
kolumn, co jest złe. Ponadto, instrukcja MySQL mówi:Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.
. Dlatego tak, podobny typ danych i ten sam znak.Odpowiedzi:
Aby dodać klucz obcy (grade_id) do istniejącej tabeli (użytkowników), wykonaj następujące kroki:
źródło
Wystarczy użyć tego zapytania, wypróbowałem go zgodnie z moim scenariuszem i działa dobrze
źródło
Proste kroki ...
źródło
sprawdź ten link. Pomogło mi to z errno 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/
Na czubku mojej głowy przychodzą mi na myśl dwie rzeczy.
Zgaduję, że problem polega na ustawieniu NULL przy aktualizacji (jeśli moje mózgi nie są dzisiaj odwrócone, jak to często bywa ...).
Edycja: Brakuje komentarzy do twojego oryginalnego postu. Niepodpisane / niepodpisane kolumny int mogą rozwiązać problem. Mam nadzieję, że mój link pomaga komuś w przyszłości pomyśleć.
źródło
Ale twój stół ma:
To mogę ustawić kolumny Sprache NULL, ponieważ jest zdefiniowana jako NOT NULL.
źródło
MySQL wykona to zapytanie:
Twoje zdrowie!
źródło
Jak naprawić
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.
zmień tabelę i dodaj do niej indeks ...
Teraz dodaj ograniczenie
Uwaga: jeśli nie dodasz indeksu, nie zadziała.
Po walce z nim przez około 6 godzin wymyśliłem rozwiązanie. Mam nadzieję, że uratuje to duszę.
źródło
Kiedy dodajesz ograniczenie klucza obcego do tabeli za pomocą ALTER TABLE, pamiętaj, aby najpierw utworzyć wymagane indeksy.
źródło
wypróbuj wszystko w jednym zapytaniu
źródło
dzieje się tak w zasadzie, ponieważ tabele są w dwóch różnych zestawach znaków. na przykład jedna tabela utworzona w charset = utf-8, a inne tabele są utworzone w CHARSET = latin1, więc chcesz mieć możliwość dodania klucza foriegn do tych tabel. użyj tego samego zestawu znaków w obu tabelach, wtedy będziesz mógł dodać klucze foriegn. błąd 1005 niepoprawnie utworzone ograniczenie klucza foriegn może rozwiązać ten problem
źródło
Przeszedłem przez ten sam problem. W moim przypadku tabela ma już dane i w tej tabeli znajdował się klucz, którego nie było w tabeli referencyjnej. Musiałem więc usunąć te wiersze, które nie respektują ograniczeń i wszystko działało.
źródło
krok 1: uruchom ten skrypt
krok 2: dodaj kolumnę
krok 3: dodaj klucz obcy do dodanej kolumny
krok 4: uruchom ten skrypt
źródło
Przykład:-
źródło