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;
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
+1 dla "Obie tabele muszą być tabelami InnoDB", wielkie dzięki! – sanbhat
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