MySql Fehler 150 - Fremdschlüssel
-
05-07-2019 - |
Frage
Wenn ich ausführen die zwei Abfragen folgen (ich habe sie abgespeckte unbedingt erforderlich):
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;
Ich erhalte die folgende Fehlermeldung: ERROR 1005 (HY000): Can not create table './test/bar.frm' (errno: 150)
Wenn das **** ist mein Fehler? Ich habe ihn nicht gefunden, während bei dieser für eine halbe Stunde anstarrte.
Lösung
Wenn Sie eine Tabelle neu erstellen, das war Aussetzern, muss es eine Definition haben das entspricht den Fremdschlüssel Einschränkungen Referenzierung es. Es muss haben das Recht, Spaltennamen und -typen, und es müssen Indizes für die Schlüssel Bezug genommen wird, wie bereits erwähnt. Wenn diese sind nicht zufrieden, MySQL Renditen Fehlernummer 1005 und bezieht sich auf Fehler 150 in der Fehlermeldung.
Mein Verdacht ist, dass es ist, weil Sie nicht foo
als InnoDB erstellt haben, wie alles andere in Ordnung aussieht.
Edit: von der gleichen Seite -
Beide Tabellen müssen InnoDB-Tabellen sein, und sie müssen nicht nur vorübergehend Tabellen sein.
Andere Tipps
Sie können den Befehl SHOW ENGINE INNODB STATUS
verwenden mehr spezifische Informationen über den Fehler zu erhalten.
Es wird Ihnen ein Ergebnis mit einer Status
Spalte eine Menge Text enthält.
Suchen Sie den Abschnitt AKTUELLE FOREIGN KEY ERROR genannt, die zum Beispiel könnte wie folgt aussehen:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
190215 11:51:26 Error in foreign key constraint of table `mydb1`.`contacts`:
Create table `mydb1`.`contacts` with foreign key constraint failed. You have defined a SET NULL condition but column 'domain_id' is defined as NOT NULL in ' FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT' near ' ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT'.
einen Fremdschlüssel zu erstellen,
- sowohl die Hauptsäule und der Referenzspalte muss gleiche Definition haben.
- beide Tabellen Motor muss InnoDB.
Sie können den Motor der Tabelle mit diesem Befehl ändern, nehmen Sie bitte die Sicherung durch, bevor Sie diesen Befehl ausführen.
alter table [Tabellenname] ENGINE = InnoDB;
Ich hatte das gleiche Problem, für diejenigen, die diese auch haben:
Überprüfen Sie den Tabellennamen der referenzierten Tabelle
hatte ich die ‚s‘ am Ende meiner Tabellennamen vergessen
zB Tabelle Client -> Clients
:)
bilden neben vielen anderen Gründen mit MySql Fehler am Ende 150 (während InnoDB verwenden), Eine der wahrscheinlichen Grund ist die undefinierte KEY
in der Erklärung der Tabelle erstellen, den Spaltennamen als Fremdschlüssel in der relativen verwiesen enthält Tabelle.
Lassen Sie uns die Mitteilung der Master-Tabelle erstellen sagen ist -
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;
und die create Syntax für die relative_table Tabelle, wo der Fremdschlüssel aus Primärtabelle gesetzt ist -
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;
Dieses Skript wird definitiv mit MySQL-Fehler 150 zu beenden, wenn unter Verwendung von InnoDB.
Um dies zu lösen, müssen wir eine KEY
für das die Spalte record_id
in der master_table
Tabelle hinzufügen und dann in der relative_table
Tabelle verweisen als foreign_key verwendet werden.
Schließlich die create-Anweisung für die master_table
, wird -
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;
Ich hatte sehr gleiches Problem und der Grund dafür war die „Kollation“ der Spalten war anders. Einer war latin1, während der andere war UTF-8
Dies kann auch passieren, wenn Sie nicht richtig Spaltennamen nach „Referenzen“ Stichwort gegeben haben.