Oltre formano molte altre ragioni per finire con MySql errore 150 (durante l'utilizzo di InnoDB), Una delle ragioni probabile, è l'indefinito KEY
nell'istruzione create della tabella contenente il nome della colonna referenziato come chiave esterna nella tabella relativa.
Diciamo che la dichiarazione del tavolo Crea master è -
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;
e la creazione di sintassi per la tavola relative_table dove il vincolo di chiave esterna viene impostata da tabella primaria -
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;
Questo script si concluderà definitivamente con MySql Error 150 se si utilizza InnoDB.
Per risolvere questo, è necessario aggiungere un KEY
per The colonna record_id
nella tabella master_table
e quindi fare riferimento nella tabella relative_table
da utilizzare come foreign_key.
Infine, la dichiarazione di creare per il master_table
, sarà -
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;
Un po 'di test rapidi, creando un 'foo' come sopra con MyISAM e una' bar' con InnoDB, suggerisce che sia così - prova a ricontrollare il tipo di tabella per 'foo'. – Rob
+1 per "Entrambi i tavoli devono essere tavoli InnoDB", grazie mille! – sanbhat
Anche se entrambi i tavoli erano InnoDB, avevo ancora lo stesso problema. L'ho risolto creando l'indice sulla tabella di riferimento prima di creare la chiave esterna. – IROEGBU