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?

David Espart
quelle
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.

Quassnoi
quelle
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.

Mushtaq Hussain
quelle
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.

Atomice
quelle
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
jwilm
quelle
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.

Alex
quelle
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.

Sherlock
quelle
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)

Cfreak
quelle
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;
pl1nk
quelle
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.

Arvind Bhardwaj
quelle
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)

Matthias
quelle
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.

Tyler Collier
quelle
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.

Vini.g.fer
quelle
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.

Earlin Thimbriel
quelle
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)

Hummel
quelle
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
Radamanf
quelle
0

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

Patrick Moore
quelle
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.

crocodile2u
quelle
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.

daVe
quelle
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.

klinisch
quelle
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.

Crmepham
quelle
0

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

Ruwan Jayalath
quelle