wake-up-neo.com

MySQL-Fehler 150 - Fremdschlüssel

Wenn ich die folgenden zwei Abfragen ausführe (ich habe sie auf das absolut Notwendige reduziert):

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: FEHLER 1005 (HY000): Tabelle './test/bar.frm' kann nicht erstellt werden (Fehlernummer: 150)

Wo ist der **** mein Fehler? Ich habe ihn nicht gefunden, als ich ihn eine halbe Stunde lang anstarrte.

17
Martin Thurau

Von FOREIGN KEY Einschränkungen

Wenn Sie eine gelöschte Tabelle neu erstellen, muss sie eine Definition aufweisen, die den darauf verweisenden Fremdschlüsseleinschränkungen entspricht. Es muss über die richtigen Spaltennamen und -typen verfügen und über Indizes für die Schlüssel, auf die verwiesen wird, wie bereits erwähnt. Wenn diese nicht erfüllt sind, gibt MySQL die Fehlernummer 1005 zurück und verweist in der Fehlermeldung auf den Fehler 150.

Mein Verdacht ist, dass Sie foo nicht als InnoDB erstellt haben, da alles andere in Ordnung aussieht.

Bearbeiten: von derselben Seite -

Beide Tabellen müssen InnoDB-Tabellen sein und dürfen keine TEMPORARY-Tabellen sein.

30
Greg

Mit dem Befehl SHOW ENGINE INNODB STATUS können Sie genauere Informationen zu dem Fehler abrufen.

Sie erhalten ein Ergebnis mit einer Spalte Status, die viel Text enthält.

Suchen Sie nach dem Abschnitt mit dem Namen LATEST FOREIGN KEY ERROR, der beispielsweise so aussehen könnte:

------------------------
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'.
11
user2906840

So erstellen Sie einen Fremdschlüssel:

  1. sowohl die Hauptspalte als auch die Referenzspalte müssen dieselbe Definition haben.
  2. die Engine für beide Tabellen muss InnoDB sein.

Sie können die Engine der Tabelle mit diesem Befehl ändern. Bitte erstellen Sie eine Sicherungskopie, bevor Sie diesen Befehl ausführen.

alter table [Tabellenname] ENGINE = InnoDB;

4
Suyash Jain

Abgesehen von vielen anderen Gründen, die dazu führen, dass MySql Error 150 (bei Verwendung von InnoDB) auftritt, ist einer der wahrscheinlichen Gründe die undefinierte KEY in der create-Anweisung der Tabelle, die den Spaltennamen enthält, auf den in der relativen Tabelle als Fremdschlüssel verwiesen wird.

Nehmen wir an, die create-Anweisung der master-Tabelle lautet -

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 Erstellungssyntax für die relative_table-Tabelle, in der die Fremdschlüsseleinschränkung von der Primärtabelle festgelegt wird -

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 Error 150 enden, wenn Sie InnoDB verwenden.

Um dies zu lösen, müssen wir eine KEY für die Spalte record_id in der master_table-Tabelle hinzufügen und dann in der relative_table-Tabelle referenzieren, um sie als Fremdschlüssel zu verwenden.

Schließlich lautet die create-Anweisung für den master_table:

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;

1

Ich hatte das gleiche Problem, für diejenigen, die dies auch haben:

Überprüfen Sie den Tabellennamen der referenzierten Tabelle

Ich hatte das 's' am Ende meines Tischnamens vergessen

zB Tabelle Client -> Clients

:)

1
webmaster

Dies kann auch passieren, wenn Sie nach dem Schlüsselwort "references" keinen korrekten Spaltennamen angegeben haben.

0
Ajay Sharma

Ich hatte das gleiche Problem und der Grund war, dass die "Kollation" der Spalten unterschiedlich war. Einer war lateinisch1, der andere war utf8

0
Hamed J.I