2009-05-05 20 views
16

Quando eseguo il seguire due query (li ho ridotta a assolutamente necessario):MySql Errore 150 - Le chiavi esterne

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; 

ottengo il seguente errore: ERRORE 1005 (HY000): Impossibile creare tabella './test/bar.frm' (errno: 150)

Dove il **** è il mio errore? Non l'ho trovato mentre lo fissavo per mezz'ora.

risposta

29

Da 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.

mio sospetto è che è perché non hai creato foo come InnoDB, come tutto il resto sembra OK.

Edit: dalla stessa pagina -

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

+0

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

+0

+1 per "Entrambi i tavoli devono essere tavoli InnoDB", grazie mille! – sanbhat

+1

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

1

Ho avuto lo stesso problema, per coloro che stanno avendo anche questo:

controllo il nome della tabella della tabella di riferimento

ho avuto dimenticato la "s" alla fine del mio nome della tabella

ad esempio tabella Client -> Clienti

:)

0

Ho avuto lo stesso problema e il motivo era il "confronto" delle colonne era diverso. Uno era latin1 mentre l'altro era utf8

9

È possibile utilizzare il comando SHOW ENGINE INNODB STATUS

+0

Grazie! Salvato il mio giorno –

+0

Accetto! Mostra una sezione "Ultimo errore chiave esterna", che nel mio caso mi ha detto che il nome del campo obiettivo di un vincolo di chiave esterna non è stato trovato. Questo è più utile di un semplice "Errore 150" ;-) –

+0

Nel mio caso mi ero dimenticato di impostare la colonna per consentire NULL e mettere SET NULL sul vincolo. Ma ho scoperto solo la ragione eseguendo 'SHOW ENGINE INNODB STATUS' –

1

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;

4

Per creare una chiave esterna,

  1. sia la colonna principale e la colonna di riferimento devono avere stessa definizione.
  2. entrambe le tabelle motore deve essere InnoDB.

È possibile modificare il motore della tabella utilizzando questo comando, eseguire il backup prima di eseguire questo comando.

alter tabella [nome tabella] ENGINE = InnoDB;

+2

" deve avere la stessa definizione "era la stessa codifica di charset per me – gengisdave

+0

" deve avere la stessa definizione "era lo stesso stesso flag di colonna per me: la chiave primaria esistente che stavo referenziando è stato UNSIGNED, quindi ho dovuto creare la colonna del mio nuovo tavolo che anche per la chiave straniera sul primo – cellepo

0

Ciò può verificarsi anche se non è stato fornito il nome corretto della colonna dopo la parola chiave "references".

Problemi correlati