2009-05-05 19 views
16

Kiedy I wykonanie wykonaj dwa zapytania (Mam pozbawiono je do absolutnie konieczne):MySQL Error 150 - klucze obce

mysql> CREATE TABLE foo(id INT PRIMARY KEY); 
Query OK, 0 rows affected (0.01 sec) 

mysql> CREATE TABLE bar (id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB; 

pojawia się następujący błąd: ERROR 1005 (HY000): nie można utwórz tabelę "./test/bar.frm" (errno: 150)

Gdzie **** jest mój błąd? Nie znalazłem go, wpatrując się w to przez pół godziny.

Odpowiedz

29

Od FOREIGN KEY Constraints

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

Moja podejrzenie jest to, że to dlatego, że nie stworzył foo jak InnoDB, jak wszystko wygląda OK.

Edit: z tej samej strony -

Both tables must be InnoDB tables and they must not be TEMPORARY tables.

+0

Trochę szybkiego testowania, tworzenia 'foo' jak wyżej z MyISAM i' bar' z InnoDB, sugeruje, że tak jest - spróbuj podwójnie sprawdzić typ twojej tablicy dla 'foo'. – Rob

+0

+1 dla "Obie tabele muszą być tabelami InnoDB", wielkie dzięki! – sanbhat

+1

Nawet jeśli obie tabele były InnoDB, wciąż miałem ten sam problem. Naprawiłem go przez utworzenie indeksu na wspomnianej tabeli przed utworzeniem klucza obcego. – IROEGBU

1

miałem ten sam problem, dla tych, którzy mają w tym również:

Sprawdź nazwę tabeli odwołanie tabeli

miałem zapomniałem 's' na końcu mojej tabeli

np. tabela Klient -> Klienci

:)

0

Miałem ten sam problem i powodem było "zestawienie" kolumn było inne. Jednym z nich był latin1, podczas gdy drugi był utf8

9

Można użyć polecenia SHOW ENGINE INNODB STATUS

+0

Dziękujemy! Uratowałem mój dzień –

+0

Zgadzam się! Pokazuje sekcję "Ostatni błąd klucza obcego", który w moim przypadku powiedział mi, że nie znaleziono docelowej nazwy pola ograniczenia klucza obcego. Jest to bardziej przydatne niż zwykły "Błąd 150" ;-) –

+0

W moim przypadku zapomniałem ustawić kolumnę, aby zezwolić na NULL, i ustawić SET NULL na wiązaniu. Ale dowiedziałem się tylko o przyczynie, uruchamiając komunikat "POKAŻ SILNIK WEWNĘTRZNY STATUS INNODB" –

1

Oprócz postaci wielu innych powodów do końca się z MySQL Error 150 (przy użyciu InnoDB), jeden z prawdopodobnych powodów jest nieokreślona KEY w instrukcji create tabeli zawierającej nazwę kolumny przywoływaną jako klucz obcy we względnej tabeli.

Powiedzmy CREATE zwierciadła głównego jest -

CREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

i tworzyć składni dla relative_table stole, gdzie ograniczenie klucza obcego jest ustawiony z tabeli podstawowej -

CREATE TABLE 'relative_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'salary' int(10) NOT NULL DEFAULT '',
 'grade' char(2) NOT NULL DEFAULT '',
 'record_id' char(10) DEFAULT NULL,
 PRIMARY KEY ('id'),
 CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Ten skrypt na pewno zakończy się błędem MySql Error 150, jeśli używasz InnoDB.

Aby rozwiązać ten problem, że należy dodać KEY do Kolumna record_id w tabeli master_table i odniesienie w tabeli relative_table być stosowane jako foreign_key.

Wreszcie CREATE dla master_table, będzie -

CREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id'),
 KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4

Aby utworzyć klucz obcy,

  1. zarówno głównej kolumny i kolumny odniesienia musi mieć tę samą definicję.
  2. Silnik obu tabel musi być InnoDB.

Można zmienić silnik tabeli za pomocą tego polecenia, proszę wykonać kopię zapasową przed wykonaniem tego polecenia.

zmień tabelę [nazwa tabeli] ENGINE = InnoDB;

+2

"musi mieć tę samą definicję" to kodowanie dla mojego samego zestawu znaków – gengisdave

+0

"musi mieć tę samą definicję" to dla mnie ta sama kolumna: Istniejący klucz podstawowy, do którego się odwoływałem został UNSIGNED, więc musiałem zrobić kolumnę nowego stołu, która również na klucz obcy na pierwszym – cellepo

0

Może się to również zdarzyć, jeśli nie podano prawidłowej nazwy kolumny po słowach kluczowych "references".

Powiązane problemy