MySQL. Tabelle errno 150 kann nicht erstellt werden


68

Ich muss eine Datenbank mit zwei Tabellen in MySQL erstellen, aber das Skript schlägt mit Errno 150 (Fremdschlüsselproblem) fehl. Ich habe überprüft, ob die Fremdschlüsselfelder in beiden Tabellen gleich sind, und kann keinen Fehler finden.

Hier ist das Skript:

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `testdb`;
 CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
 USE `testdb`;

 DROP TABLE IF EXISTS `testdb`.`table1` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   PRIMARY KEY (`id`) )

 ENGINE = InnoDB;


 DROP TABLE IF EXISTS `testdb`.`table2` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table2` (
   `id` INT NOT NULL AUTO_INCREMENT ,
   `field1` VARCHAR(50) NULL ,
   `date` DATE NULL ,
   `cnt` INT NULL ,
   PRIMARY KEY (`id`) ,
   INDEX `FK_table2_table1` (`field1` ASC) ,
   CONSTRAINT `FK_table2_table1`
   FOREIGN KEY (`field1`)
   REFERENCES `testdb`.`table1` (`field1` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)

 ENGINE = InnoDB;

 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Ich habe es in Windows und Ubuntu mit verschiedenen Versionen von MySQL versucht und es hat nicht funktioniert.

Irgendwelche Ideen?


9
Ich habe diesen Fehler auch erhalten, als ich versucht habe, eine Tabelle mit einer FK-Einschränkung für eine andere Tabelle zu erstellen, die noch nicht vorhanden war. Es ist ein leicht zu behebendes Problem, das durch eine völlig nutzlose Fehlermeldung sehr erschwert wird.
Cerin

2
Für diejenigen, die von Google hierher kommen, kann dieser Fehler auch auftreten, wenn Sie einen Tippfehler in den Tabellennamen des Fremdschlüssels machen.
Dave C

Antworten:


54

table1.field1 Es ist kein Index definiert.

Es ist erforderlich, eine FOREIGN KEYEinschränkung festzulegen field1.

Mit diesem:

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   KEY ix_table1_field1 (field1),
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;

Alles sollte dann wie erwartet funktionieren.


18
Obwohl dies in diesem Fall nicht zutrifft, wird dieselbe Fehlermeldung angezeigt, wenn Sie versuchen, eine Fremdschlüsseleinschränkung hinzuzufügen, und beim Löschen für eine nicht nullfähige Spalte auf null gesetzt wird.
John Zumbrum

49

Bei der Arbeit mit MySQL Workbench und MySQL 5.5.27 bin ich auf ein ähnliches Problem gestoßen. In meinem Fall gab es Probleme mit Feldern vom Typ INT. In einer Tabelle war es fälschlicherweise INT UNSIGNED und in der Referenzierungstabelle war es INT.


11
Das war genau mein Problem. Vielen Dank!
RJ Spiker

13

Abhängig von der Version von MySQL müssen Sie möglicherweise zuerst einen Index für table1.field1 erstellen.


8

Eine der Antworten hier schlägt vor, die Integritätsprüfung für Fremdschlüssel zu deaktivieren. Das ist eine schlechte Idee. Hier gibt es zwei wahrscheinliche Schuldige:

  • Nicht übereinstimmende Datentypen zwischen referenziertem Primärschlüssel und referenzierendem Fremdschlüssel
  • Indizes. Alle Fremdschlüssel, die Sie indizieren, dürfen NICHT NULL sein

Das NOT NULL-Argument gilt nicht für meine MySQL 5.5
e2-e4

6

Ein weiterer Hinweis:

Selbst wenn Ihre Datentypen gleich zu sein scheinen - in meinem Fall beide Spalten VARCHAR(50)-, reicht dies nicht aus.

Sie müssen auch sicherstellen, dass beide Spalten gleich sind COLLATION.


5

Noch eine andere Ursache, obwohl sie anderen etwas ähnlich ist: Ich bezog mich auf eine Tabelle, die anstelle von InnoDB die MyISAM-Engine enthielt.


5

MySQL löst diesen Fehler auch aus, wenn Sie den Namen der verweisenden Tabelle falsch eingeben. Ich zog mir eine Weile die Haare aus, bis mir klar wurde, dass ich einen Brief verpasst hatteforeign key (column1) references mistyped_table(column1)


In einigen Situationen ist der Fall (des Tabellennamens) wichtig - in einigen nicht. Zum Beispiel funktionierte mein Skript unter MySQL unter OSX, aber unter Linux hatte ich das Problem errno: 150. Fall war mein Problem.
prule

Ebenso hatte ich FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE, aber die userTabelle hat kein Feld id- es wurde aufgerufen user_id! Also habe ich mich oben geändertuser(id) zu user(user_id), und alles war gut im Universum wieder ... für jetzt.
Elimisteve

5

Eine Option (je nach Fall) wäre das Deaktivieren der MySQL-Integritätsprüfung:

SET FOREIGN_KEY_CHECKS = 0;

1

Wenn nichts funktioniert, versuchen Sie Folgendes:

Der Fremdschlüsselname ist ein Duplikat eines bereits vorhandenen Schlüssels. Überprüfen Sie, ob der Name Ihres Fremdschlüssels in Ihrer Datenbank eindeutig ist. Fügen Sie einfach ein paar zufällige Zeichen am Ende Ihres Schlüsselnamens hinzu, um dies zu testen.


1

Ich habe diesen Fehler erhalten, als ich versucht habe, mit einem Fremdschlüssel auf ein nicht eindeutiges Feld zu verweisen. (was anscheinend nicht erlaubt ist)


0

In meinem Fall verwendete eine Tabelle Fremdschlüsseleinschränkungen für eine andere Tabelle, die noch nicht vorhanden war. Dies geschah aufgrund eines großen Makefiles, daher war es nicht so offensichtlich, wie ich es erwartet hätte.


0

Falls jemand immer noch Probleme damit hat, habe ich alle oben genannten Lösungen ausprobiert (außer SET FOREIGN_KEY_CHECKS) und nichts hat funktioniert. Das Problem war, dass beim Verweisen auf die erste Tabelle bei einigen Datenbanken die Tabellennamen zwischen Groß- und Kleinschreibung unterschieden werden. Ich finde das komisch, da ich das noch nie bei MySQL, Oracle gesehen habe und jetzt bei MariaDB.

Zum Beispiel:

Tabelle erstellen, falls nicht vorhanden CADASTRO_MAQUINAS (ID VARCHAR (16), Primärschlüssel (ID));

Tabelle erstellen, falls nicht vorhanden INFOS (Id_Maquina VARCHAR (16) NOT NULL, CONSTRAINT FK_infos_cadastro_maquinas Fremdschlüssel (Id_Maquina) verweist auf CADASTRO_MAQUINAS (Id));

Wenn ich versuche, die zweite Tabelle mit cadastro_maquinas (Kleinbuchstaben) anstelle von CADASTRO_MAQUINAS zu erstellen, wird dieser Fehler angezeigt.


0

Ich habe benutzt MySQL workBench. Das Problem ist, dass Sie nicht dasselbe verwenden können foreign key name, es muss sein unique. Wenn also mehr als eine Tabelle auf denselben Fremdschlüssel verweist, muss jedes Mal ein uniqueName angegeben werden.


0

Ich hatte einen ähnlichen Fehler an einer meiner Tabellen. Wenn diese Option aktiviert war, war die Spaltenkollatierung unterschiedlich, wodurch beide Spalten auf denselben Sortierungstyp geändert wurden.

Nachdem Sie den größten Teil der hier vorgeschlagenen Lösung gelesen haben. Ich dachte nur, es könnte hilfreich sein, wenn ich nur alle Möglichkeiten aufführe, die diesen Fehler auslösen könnten.

1, CASE der Spalte 2 prüfen, COLLATION of Columns 3 prüfen, In beiden Tabellen einen Schlüssel für die Spalte erstellen (Unique, Primary)


0

In meinem Fall habe ich die alte Tabellendefinition MyISAM in einer der Tabellen erhalten und konnte offensichtlich keinen Fremdschlüssel aus einer anderen Tabelle erstellen. Vielleicht hilft das jemandem.

Dies kann also aufgrund von Inkonsistenzen zwischen zwei Datenbanken / Felddefinitionen passieren, die zu überprüfen versuchen:

Field Type
Field Collation
Table Engine

0

Für mich war das Problem die Verwendung CONSTRAINTin der CREATE TABLEAbfrage.


0

Möglicherweise tritt der gleiche Fehler auch auf, wenn Sie versuchen, auf einen zusammengesetzten Schlüssel in Ihrem Fremdschlüssel zu verweisen.

Zum Beispiel:

CREATE TABLE `article` (
  `id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  PRIMARY KEY (`id`,`type`)
) ENGINE InnoDB;

CREATE TABLE `t1` (
  `user_id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  `article_id` int(10) unsigned NOT NULL,
  CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

In diesem Fall ist es wichtig, article_id und type field in der FK-Definition in derselben Reihenfolge zu verwenden, in der sie in der PRIMARY KEY-Definition der Artikeltabelle angezeigt werden.


0

In meinem Fall war wahrscheinlich ein Serverfehler beim Löschen einer Tabelle mit demselben Namen. Das Problem wurde behoben, indem das gesamte Shcema gelöscht und neu erstellt wurde.



0

Wenn Sie an der MySQL-Workbench arbeiten und diesen Fehler für eine Beziehungstabelle erhalten, gibt es möglicherweise eine schnelle Lösung für Sie: Löschen Sie sie einfach und lassen Sie die MySQL-Workbench sie für Sie neu erstellen. Dann kopieren Sie die SQL. Mein Errno 150 Problem wurde behoben.


0

Als ich dieses Problem hatte, lag es daran, dass ich die ID in der ersten Tabelle so festgelegt hatte, unsignedwährend dies bei dem Fremdschlüssel in der zweiten Tabelle nicht der Fall war. Beide haben unsignedes für mich repariert.


0

Erstellen Sie immer zuerst Master- / Parent-Tabellen und dann Ihre Detail- / Child-Tabellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.