it-swarm.com.de

MySQL: Tabelle kann nicht erstellt werden (Fehlernummer: 150)

Ich versuche, eine .sql-Datei zu importieren, und das Erstellen von Tabellen schlägt fehl.

Hier ist die Abfrage, die fehlschlägt:

CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;    

Ich exportierte die .sql aus der gleichen Datenbank, löschte alle Tabellen und jetzt versuche ich, sie zu importieren. Warum schlägt sie fehl?

MySQL: Die Tabelle './dbname/data.frm' kann nicht erstellt werden (Fehlernummer: 150).

148
gtilx

Aus der MySQL - FOREIGN KEY-Einschränkungsdokumentation :

Wenn Sie eine Tabelle neu erstellen, die gelöscht wurde, muss sie eine Definition haben, die den Fremdschlüsseleinschränkungen entspricht, auf die sie verweist. Es muss über die richtigen Spaltennamen und -typen verfügen, und es muss Indizes für die referenzierten Schlüssel enthalten, wie zuvor angegeben. Wenn diese Bedingungen nicht erfüllt sind, gibt MySQL den Fehler 1005 zurück und verweist in der Fehlernachricht auf Fehler 150, was bedeutet, dass eine Fremdschlüsseleinschränkung nicht ordnungsgemäß gebildet wurde. In ähnlicher Weise, wenn eine ALTER TABLE fehlschlägt Fehler 150 bedeutet, dass eine Fremdschlüsseldefinition für die geänderte Tabelle falsch gebildet wurde. 

160
OMG Ponies

Fehler 150 bedeutet, dass Sie ein Problem mit Ihrem Fremdschlüssel haben. Möglicherweise ist der Schlüssel auf dem Fremdtisch nicht exakt derselbe Typ.

96
Dan McGrath

Sie können die eigentliche Fehlermeldung erhalten, indem Sie SHOW ENGINE INNODB STATUS; ausführen und dann in der Ausgabe nach LATEST FOREIGN KEY ERROR suchen.

Quelle: Antwort eines anderen Benutzers in einer ähnlichen Frage

58

Datentypen müssen genau übereinstimmen. Wenn Sie mit Varchar-Typen arbeiten, müssen die Tabellen dieselbe Sortierung verwenden.

27

Ich denke, dass alle diese Antworten, obwohl sie korrekt sind, die Frage irreführen. 

Die eigentliche Antwort lautet, bevor Sie eine Wiederherstellung starten, wenn Sie eine Sicherungsdatei mit Fremdschlüsseln wiederherstellen: 

SET FOREIGN_KEY_CHECKS=0;

da die Wiederherstellung natürlich einige Einschränkungen erzeugt, bevor die fremde Tabelle überhaupt existiert. 

23
colin

In einigen Fällen wird diese Fehlermeldung möglicherweise angezeigt, wenn zwischen den zugehörigen Tabellen unterschiedliche Module vorhanden sind. Beispielsweise kann eine Tabelle InnoDB verwenden, während die andere MyISAM verwendet. Beide müssen gleich sein

20
pi.

Fehler Nr. 150 bedeutet einen Fremdschlüsseleinschränkungsfehler. Sie erstellen diese Tabelle wahrscheinlich vor der Tabelle, von der der Fremdschlüssel abhängt (Tabelle keywords). Erstellen Sie diese Tabelle zuerst und es sollte gut funktionieren. 

Ist dies nicht der Fall, entfernen Sie die Fremdschlüsselanweisung und fügen Sie sie nach dem Erstellen der Tabelle hinzu. Sie erhalten eine aussagekräftigere Fehlermeldung über den spezifischen Einschränkungsfehler.

11
Eran Galperin

Es gibt einige Dinge, die zu errno 150 führen können. Für Leute, die dieses Thema durchsuchen, glaube ich, dass diese Liste nahezu vollständig ist (Quelle Ursachen von Errno 150 ):

Für Errno 150 oder Errno 121 wird einfach SHOW ENGINE INNODB STATUS eingegeben. Es gibt einen Abschnitt mit der Bezeichnung "LATEST FOREIGN KEY ERROR". Daraufhin erhalten Sie eine sehr hilfreiche Fehlermeldung, die Ihnen in der Regel sofort anzeigt, was los ist. Sie benötigen SUPER-Berechtigungen, um es auszuführen. Wenn Sie dies nicht haben, müssen Sie lediglich die folgenden Szenarien testen.

1) Datentypen stimmen nicht überein: Die Spaltentypen müssen gleich sein

2) Übergeordnete Spalten nicht indiziert (oder in falscher Reihenfolge indiziert)

3) Spalten-Sortierungen stimmen nicht überein

4) Verwenden von SET NULL für eine NOT NULL-Spalte

5) Tabellensortierungen stimmen nicht überein: Auch wenn die Spaltensortierungen übereinstimmen, kann dies bei einigen MySQL-Versionen ein Problem sein.

6) Übergeordnete Spalte ist in der übergeordneten Tabelle nicht vorhanden. Rechtschreibung prüfen (und eventuell ein Leerzeichen am Anfang oder Ende der Spalte)

7) Einer der Indizes in einer der Spalten ist unvollständig oder die Spalte ist zu lang für einen vollständigen Index. Beachten Sie, dass MySQL (sofern Sie dies nicht ändern) eine maximale Länge eines einzelnen Spaltenschlüssels von 767 Byte hat (dies entspricht einer varchar (255) UTF-Spalte).

Falls Sie eine errno 121 erhalten, gibt es ein paar Gründe:

1) Der von Ihnen gewählte Einschränkungsname ist bereits vergeben

2) Auf einigen Systemen, wenn in Ihren Anweisungs- und Tabellennamen ein Fallunterschied besteht. Dies kann Sie beißen, wenn Sie von einem Server zu einem anderen wechseln, der andere Regeln für die Fallbehandlung hat.

10
juacala

Manchmal ist MySQL einfach nur dumm - ich kann die Ursache von Fremdschlüsseln verstehen. Aber in meinem Fall habe ich einfach die gesamte Datenbank gelöscht, und ich bekomme immer noch den Fehler ... warum? Ich meine, es gibt keine Datenbank mehr ... und der SQL-Benutzer, den ich verwende, hat keinen Zugriff auf andere DBs auf dem Server ... Ich meine, der Server ist für den aktuellen Benutzer "leer" und erhalte ich immer noch dieser Fehler? Tut mir leid, aber ich schätze, MySQL lügt mich an ... aber ich kann damit umgehen.

SET FOREIGN_KEY_CHECKS = 0;
# some code that gives you errno: 150
SET FOREIGN_KEY_CHECKS = 1;

Jetzt sollte das SQL ausgeführt werden ... Wenn Sie wirklich ein Fremdschlüsselproblem haben, wird es Ihnen durch die Zeile angezeigt, in der Sie die Überprüfungen wieder aktivieren werden - dies wird fehlschlagen .. aber mein Server ist nur ruhig :)

8
jebbie

Dieser Fehler ist aufgetreten, wenn die Windows-Anwendung nach Linux portiert wurde. In Windows sind die Namen der Datenbanktabellen unabhängig von der Schreibweise und in Linux die Groß- und Kleinschreibung, möglicherweise aufgrund des Unterschieds im Dateisystem. Unter Windows ist die Tabelle Table1 dieselbe wie table1, und in REFERENCES funktionieren sowohl table1 als auch Table1. Wenn unter Linux table1 anstelle von Table1 beim Erstellen der Datenbankstruktur verwendet wurde, sah ich Fehler # 150; Als ich in Table1-Referenzen den richtigen Groß-/Kleinschreibung eingegeben hatte, funktionierte es auch unter Linux. Wenn nichts anderes hilft, stellen Sie sicher, dass Sie in REFERENCES den korrekten Buchstaben in Tabellennamen verwenden, wenn Sie unter Linux arbeiten.

4
Vitaliy

Nachdem Sie die obigen Antworten durchgesehen und ein wenig experimentiert haben, ist dies ein effektiver Weg, um Fremdschlüsselfehler in MySQL (1005 - Fehler 150) zu lösen.

Für die korrekte Erstellung des Fremdschlüssels verlangt MySQL Folgendes:

  • Alle referenzierten Schlüssel MÜSSEN entweder den Index PRIMARY oder UNIQUE haben.
  • Erneutes Verweisen auf die Spalte MUSS mit der Spalte "Referenziert" identisch sein. 

Erfüllen Sie diese Anforderungen und alles wird gut.

4
Davies Malesi

In meinem Fall. Ich hatte Probleme mit Engine und Zeichensatz, da meine Hosting-Server-Einstellungen und meine neuen Tabellen MyISAM waren, aber meine alten Tabellen sind InnoDB. Ich habe mich nur verändert.

3

Ändern Sie die Engines Ihrer Tabellen, nur InnoDB unterstützt Fremdschlüssel

3
Lappies

Ich hatte das gleiche Problem. Sie stand in Beziehung zur Tabellenspalte Kollatierung und Zeichensatz. Stellen Sie sicher, dass Zeichensatz und Kollatierung für beide Spalten gleich sein müssen auf zwei tischen. Wenn Sie einen Fremdschlüssel für das festlegen möchten . Beispiel: Wenn Sie einen Fremdschlüssel in die Spalte userID der Tabelle userImage setzen, die auf die Spalte userID der Benutzertabelle verweist, dann muss die Sortierreihenfolge utf8_general_ci and Character sein Setzen Sie utf8 für beide Tabellenspalten. Wenn Sie eine Tabelle erstellen, verwendet mysql diese beiden Konfigurationen im Allgemeinen aus den Servereinstellungen.

3
Sushilkumar

Wenn die PK-Tabelle in einem-ZEICHENSATZerstellt wird und Sie dann die FK-Tabelle in einem anderen CHARSET .. erstellen, können Sie auch diesen Fehler erhalten ... Ich habe diesen Fehler aber auch nach dem Umstellen des Zeichensatzes auf PK-Zeichensatz erhalten es wurde fehlerfrei ausgeführt 

create table users
(
------------
-------------
)DEFAULT CHARSET=latin1;


create table Emp
(
---------
---------
---------
FOREIGN KEY (userid) REFERENCES users(id) on update cascade on delete cascade)ENGINE=InnoDB, DEFAULT CHARSET=latin1;
3
tinku

In den meisten Fällen liegt das Problem an der ENGINE-Entsprechung. Wenn das übergeordnete Element von InnoDB erstellt wird, werden die referenzierten Tabellen von MyISAM erstellt und umgekehrt

3

Dieser Fehler kann auftreten, wenn zwei Tabellen einen Verweis haben, z. B. eine Tabelle Student und eine andere Tabelle Education, und die Education-Tabelle soll einen Fremdschlüssel-Verweis auf die Student-Tabelle haben. In diesem Fall sollte der Spaltendatentyp für beide Tabellen gleich sein, andernfalls wird ein Fehler generiert.

3
manzarul haque

Ich hatte ein ähnliches Problem, aber mein Problem bestand darin, dass ich einer vorhandenen Tabelle, die Daten enthielt, ein neues Feld hinzufügte und das neue Feld auf ein anderes Feld aus der übergeordneten Tabelle verweist und auch die Definition von NOT NULL hatte und keine DEFAULT VALUES. - Ich fand heraus, dass die Dinge nicht funktionierten, weil 

  1. Mein neues Feld musste die leeren Felder automatisch mit einem Wert aus der übergeordneten Tabelle in jedem Datensatz füllen, bevor die Einschränkung angewendet werden konnte. Jedes Mal, wenn die Einschränkung angewendet wird, muss die Integrität der Tabellendaten intakt bleiben. Wenn Sie die Einschränkung (Fremdschlüssel) implementieren, obwohl es einige Datenbankeinträge gab, für die die Werte aus der übergeordneten Tabelle nicht vorhanden waren, bedeutet dies, dass die Daten beschädigt sind, sodass MySQL NIEMALS IHRE BESCHRÄNKUNG durchsetzen würde

Es ist wichtig zu wissen, dass unter normalen Umständen, wenn Sie Ihre Datenbank frühzeitig geplant und Einschränkungen vor dem Einfügen von Daten implementiert haben, dieses spezielle Szenario vermieden würde

Der einfachere Ansatz, um dieses Problem zu vermeiden, ist das

  • Speichern Sie die Daten Ihrer Datenbanktabellen
  • Kürzen Sie die Tabellendaten (und Tabellenartefakte, z. B. Indizes usw.).
  • Wenden Sie die Einschränkungen an
  • Importieren Sie Ihre Daten

Ich hoffe das hilft jemandem 

2
chitwarnold

Ich hatte den gleichen Fehler. In meinem Fall lag der Grund für den Fehler darin, dass ich in der Einschränkung eine ON DELETE SET NULL-Anweisung hatte, während das Feld, auf das ich die Einschränkung in seiner Definition aufbaute, eine NOT NULL-Anweisung hatte. Das Zulassen von NULL im Feld hat das Problem gelöst.

2

Stellen Sie sicher, dass sowohl Ihre Primärschlüsselspalte als auch die referenzierte Spalte die gleichen Datentypen und Attribute haben (unsigned, binary, unsigned nullofill usw.).

2
Basit

normalerweise verursacht die Nichtübereinstimmung zwischen Fremdschlüssel und Primärschlüssel die Fehler: 150.

Der foreign key muss den gleichen datatype wie der primary key haben. Wenn der Primärschlüssel unsigned ist, muss auch der Foreign-Schlüssel ebenfalls unsigned sein.

2
Rakesh

In einem echten Edge-Fall haben Sie ein MySQL-Tool verwendet (in meinem Fall Sequel Pro), um eine Datenbank umzubenennen. Dann wurde eine Datenbank mit demselben Namen erstellt.

Dadurch wurden Fremdschlüsseleinschränkungen auf denselben Datenbanknamen beibehalten, sodass die umbenannte Datenbank (z. B. my_db_renamed) Fremdschlüsseleinschränkungen in der neu erstellten Datenbank (my_db) hatte.

Ich bin nicht sicher, ob dies ein Fehler in Sequel Pro ist oder ob ein Anwendungsfall dieses Verhalten erfordert, aber es hat mich am besten für einen Morgen gekostet: /

2
chim

Ich hatte ein ähnliches Problem, als ich eine Django-MySQL-Datenbank mit einer einzigen Tabelle ablegte. Ich konnte das Problem beheben, indem ich die Datenbank in eine Textdatei abbildete, die betreffende Tabelle mit emacs an das Ende der Datei verschob und die geänderte SQL-Abbilddatei in die neue Instanz importierte. 

HTH Uwe

1
hoover

Die Spalte der PARENT-Tabelle, auf die Sie sich aus der untergeordneten Tabelle beziehen, muss eindeutig sein. Ist dies nicht der Fall, verursachen Sie einen Fehler Nr. 150.

1
Dila Ram Gurung

Ich habe das gleiche Problem, wenn ich eine Reihe von MySQL-Befehlen ausführte. Meine findet beim Erstellen einer Tabelle statt, wenn ein Fremdschlüssel auf eine andere Tabelle verweist, die noch nicht erstellt wurde. Es ist die Reihenfolge der Tabellenexistenz vor der Referenzierung.

Die Lösung: Erstellen Sie zuerst die übergeordneten Tabellen, bevor Sie eine untergeordnete Tabelle mit einem Fremdschlüssel erstellen.

1
ronIT

Stellen Sie sicher, dass alle Tabellen Fremdschlüssel unterstützen können - die InnoDB-Engine 

1
joksy82

Bei der Erstellung von DB aus der Textdatei bin ich mit diesem Problem konfrontiert. 

mysql -uroot -padmin < E:\important\sampdb\createdb.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\insert_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\insert_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\load_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\load_absence.sql 

Ich habe gerade die obigen Zeilen in Create.bat geschrieben und die bat-Datei ausgeführt.

Mein Fehler liegt in der Reihenfolge der Ausführung in meinen SQL-Dateien. Ich habe versucht, eine Tabelle mit Primärschlüssel und auch Fremdschlüssel zu erstellen. Während es läuft, sucht es nach der Referenztabelle, aber die Tabellen sind nicht vorhanden . Diese Art von Fehler wird zurückgegeben.

Wenn Sie Tabellen mit einem Fremdschlüssel erstellen, überprüfen Sie die Referenz Tische waren vorhanden oder nicht. Überprüfen Sie auch den Namen der Referenz Tabellen und Felder.

1
Dharani Dharan

Vielleicht das wird helfen? Die Definition der Primärschlüsselspalte sollte genau der Fremdschlüsselspalte entsprechen.

1
Mukus

Ich habe das Problem behoben, indem ich die Variable null akzeptiere.

ALTER TABLE `ajout_norme` 
CHANGE `type_norme_code` `type_norme_code` VARCHAR( 2 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL
1
Fahmi

Ich hatte den gleichen Fehler, dann habe ich zuerst eine referenzierte Tabelle erstellt und dann eine Tabelle verwiesen

zum Beispiel, wenn Sie Mitarbeiter- und Abteilungstabellen haben, die Sie zuordnen ausländisch Beschränkung auf dept_no in der Employee-Tabelle. Stellen Sie dann sicher, dass die Abteilung. Die Tabelle wird erstellt und hat dept_no Primärschlüsseleinschränkungen zugewiesen.

das funktionierte für mich ...

1
pooja patil

Erstellen Sie die Tabelle ohne Fremdschlüssel, und legen Sie dann den Fremdschlüssel separat fest.

1
stuckhelper

Wenn Sie eine Tabelle neu erstellen, die gelöscht wurde, muss sie eine Definition haben, die den Fremdschlüsseleinschränkungen entspricht, auf die sie verweist. Es muss über die richtigen Spaltennamen und -typen verfügen, und es muss Indizes für die referenzierten Schlüssel enthalten, wie zuvor angegeben. Wenn diese nicht erfüllt sind, gibt MySQL in der Fehlernachricht " Error 1005 " zurück und verweist auf " Error 150 ". Dies bedeutet, dass eine Fremdschlüsseleinschränkung nicht ordnungsgemäß gebildet wurde. Wenn ein ALTER TABLE aufgrund des Fehlers 150 fehlschlägt, bedeutet dies in ähnlicher Weise, dass eine Fremdschlüsseldefinition für die geänderte Tabelle falsch gebildet wurde.

0
Piyush Agarwal