Ich versuche, eine SQL-Datei zu importieren, und sie schlägt beim Erstellen von Tabellen 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 habe die .sql aus derselben Datenbank exportiert, alle Tabellen gelöscht und jetzt versuche ich, sie zu importieren. Warum schlägt sie fehl?
MySQL: Tabelle './dbname/data.frm' kann nicht erstellt werden (errno: 150)
mysql
sql
phpmyadmin
mysql-error-150
gtilx
quelle
quelle
Antworten:
Aus der MySQL - FOREIGN KEY Constraints-Dokumentation :
quelle
Whether its possible to write Nested Query for my problem
? ..Ich würde Sie bitten, mir auch zu antworten!Fehler 150 bedeutet, dass Sie ein Problem mit Ihrem Fremdschlüssel haben. Möglicherweise ist der Schlüssel auf dem Fremdtisch nicht genau der gleiche Typ?
quelle
BIGINT
vs.INT
Sie können die eigentliche Fehlermeldung erhalten, indem Sie ausführen
SHOW ENGINE INNODB STATUS;
und dannLATEST FOREIGN KEY ERROR
in der Ausgabe suchen .Quelle: Antwort eines anderen Benutzers in einer ähnlichen Frage
quelle
Datentypen müssen genau übereinstimmen. Wenn Sie mit Varchar-Typen arbeiten, müssen die Tabellen dieselbe Sortierung verwenden.
quelle
Ich denke, all diese richtigen Antworten führen die Frage in die Irre.
Die eigentliche Antwort lautet: Bevor Sie eine Wiederherstellung starten, wenn Sie eine Speicherauszugsdatei mit Fremdschlüsseln wiederherstellen:
da die Wiederherstellung natürlich einige Einschränkungen erzeugt, bevor die fremde Tabelle überhaupt existiert.
quelle
In einigen Fällen kann diese Fehlermeldung auftreten, wenn zwischen den zugehörigen Tabellen unterschiedliche Engines vorhanden sind. Beispielsweise kann eine Tabelle InnoDB verwenden, während die andere MyISAM verwendet. Beide müssen gleich sein
quelle
Fehler Nr. 150 bedeutet einen Fehler bei der Fremdschlüsseleinschränkung. 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.Wenn dies nicht der Fall ist, entfernen Sie die Fremdschlüsselanweisung und fügen Sie sie hinzu, nachdem die Tabelle erstellt wurde. Sie erhalten eine aussagekräftigere Fehlermeldung über den spezifischen Einschränkungsfehler.
quelle
Es gibt einige Dinge, die Errno 150 verursachen können. Für Leute, die dieses Thema suchen, ist hier eine meiner Meinung nach nahezu vollständige Liste (Quelle Ursachen von Errno 150 ):
Für errno 150 oder errno 121, indem Sie einfach SHOW ENGINE INNODB STATUS eingeben, gibt es einen Abschnitt namens "LATEST FOREIGN KEY ERROR". Darunter erhalten Sie eine sehr hilfreiche Fehlermeldung, die Ihnen in der Regel sofort mitteilt, worum es geht. Sie benötigen SUPER-Berechtigungen, um es auszuführen. Wenn Sie diese nicht haben, müssen Sie nur die folgenden Szenarien testen.
1) Datentypen stimmen nicht überein: Die Spaltentypen müssen identisch sein
2) Übergeordnete Spalten nicht indiziert (oder in falscher Reihenfolge indiziert)
3) Spaltenkollatierungen stimmen nicht überein
4) Verwenden von SET NULL für eine NOT NULL-Spalte
5) Tabellenkollatierungen stimmen nicht überein: Selbst wenn die Spaltenkollatierungen übereinstimmen, kann dies bei einigen MySQL-Versionen ein Problem sein.
6) Die übergeordnete Spalte ist in der übergeordneten Tabelle nicht vorhanden. Überprüfen Sie die Rechtschreibung (und möglicherweise ein Leerzeichen am Anfang oder Ende der Spalte).
7) Einer der Indizes für eine der Spalten ist unvollständig oder die Spalte ist zu lang für einen vollständigen Index. Beachten Sie, dass MySQL (sofern Sie es nicht optimieren) eine maximale Schlüssellänge für eine Spalte von 767 Byte hat (dies entspricht einer varchar (255) UTF-Spalte).
Falls Sie eine Errno 121 erhalten, gibt es einige Ursachen:
1) Der von Ihnen gewählte Einschränkungsname ist bereits vergeben
2) Auf einigen Systemen, wenn bei Ihren Anweisungs- und Tabellennamen ein Fallunterschied besteht. Dies kann Sie beißen, wenn Sie von einem Server zu einem anderen wechseln, für den unterschiedliche Regeln für die Fallbearbeitung gelten.
quelle
Manchmal ist MySQL einfach nur super dumm - ich kann den Grund für Fremdschlüssel verstehen. Aber in meinem Fall habe ich gerade die gesamte Datenbank gelöscht und erhalte immer noch den Fehler. Warum? Ich meine, es gibt keine Datenbank mehr ... und der SQL-Benutzer, den ich benutze, hat keinen Zugriff auf andere Datenbanken auf dem Server ... Ich meine, der Server ist für den aktuellen Benutzer "leer" und ich bekomme immer noch dieser Fehler? Tut mir leid, aber ich denke, MySQL lügt mich an ... aber ich kann damit umgehen :) Fügen Sie einfach diese beiden Zeilen SQL um Ihre verdammte Aussage hinzu:
Jetzt sollte die SQL ausgeführt werden ... Wenn Sie wirklich ein Fremdschlüsselproblem haben, wird es Ihnen in der Zeile angezeigt, in der Sie die Überprüfungen wieder aktivieren - dies wird dann fehlschlagen ... aber mein Server ist nur leise :)
quelle
Nachdem Sie die obigen Antworten durchgearbeitet und ein wenig experimentiert haben, ist dies ein effektiver Weg, um Fremdschlüsselfehler in MySQL zu lösen (1005 - Fehler 150).
Damit der Fremdschlüssel ordnungsgemäß erstellt werden kann, muss MySQL lediglich Folgendes tun:
Erfüllen Sie diese Anforderungen und alles wird gut.
quelle
Ich habe diesen Fehler festgestellt, als ich die Windows-Anwendung auf Linux portiert habe. In Windows wird bei Namen von Datenbanktabellen nicht zwischen Groß- und Kleinschreibung unterschieden, und unter Linux wird zwischen Groß- und Kleinschreibung unterschieden, wahrscheinlich aufgrund von Unterschieden im Dateisystem. Also, auf Windows-Tabelle
Table1
ist das gleiche wietable1
und inREFERENCES
beidentable1
undTable1
funktioniert. Unter Linux wurde bei der Verwendung der Anwendungtable1
anstelle derTable1
Datenbankstruktur der Fehler # 150 angezeigt. Als ich inTable1
Referenzen korrekte Groß- und Kleinschreibung machte , funktionierte es auch unter Linux. Wenn nichts anderes hilft, stellen Sie sicher, dassREFERENCES
Sie unter Linux die richtige Groß- und Kleinschreibung im Tabellennamen verwenden.quelle
Ändern Sie die Engines Ihrer Tabellen, nur innoDB unterstützt Fremdschlüssel
quelle
Wenn die PK-Tabelle in einem CHARSET erstellt wird und Sie dann eine FK-Tabelle in einem anderen CHARSET erstellen. Dann wird möglicherweise auch dieser Fehler angezeigt. Auch ich habe diesen Fehler erhalten, aber nachdem der Zeichensatz in PK-Zeichensatz geändert wurde, wurde er fehlerfrei ausgeführt
quelle
Dieser Fehler kann auftreten, wenn zwei Tabellen eine Referenz haben, z. B. eine Tabelle Student und eine andere Tabelle Education, und wir möchten, dass die Education-Tabelle eine Fremdschlüsselreferenz der Student-Tabelle enthält. In diesem Fall sollte der Spaltendatentyp für beide Tabellen gleich sein, da sonst ein Fehler generiert wird.
quelle
In den meisten Fällen liegt das Problem an der ENGINE-Differenz. Wenn das übergeordnete Element von InnoDB erstellt wird, sollten die referenzierten Tabellen von MyISAM erstellt werden und umgekehrt
quelle
In meinem Fall. Ich hatte Probleme mit der Engine und dem Zeichensatz, weil mein Hosting-Server die Einstellungen änderte und meine neuen Tabellen MyISAM waren, meine alten Tabellen jedoch InnoDB sind. Ich habe mich nur verändert.
quelle
Der Fremdschlüssel muss denselben Datentyp wie der Primärschlüssel haben . Auch wenn der Primärschlüssel ist unsigned dann der Fremdschlüssel muss auch sein , ohne Vorzeichen .
quelle
Ich hatte das gleiche Problem. Es bezog sich auf die Tabellenspalte Kollatierung und Zeichensatz . Stellen Sie sicher, dass Zeichensatz und Sortierung für beide Spalten in zwei Tabellen identisch sind. Wenn Sie einen Fremdschlüssel festlegen möchten. Beispiel: Wenn Sie einen Fremdschlüssel in die Spalte userID der Tabelle userImage einfügen, die auf die Spalte userID der Tabelle users verweist. Die Sortierung muss dann für beide Tabellenspalten mit utf8_general_ci und dem Zeichensatz utf8 identisch sein . Wenn Sie eine Tabelle erstellen, übernimmt mysql im Allgemeinen diese beiden Konfigurationen aus den Servereinstellungen.
quelle
Stellen Sie sicher, dass sowohl Ihre Primärschlüsselspalte als auch die referenzierte Spalte dieselben Datentypen und Attribute haben (vorzeichenlose, binäre, vorzeichenlose Nullfüllung usw.).
quelle
In einem echten Randfall haben Sie ein MySQL-Tool (in meinem Fall Sequel Pro) verwendet, um eine Datenbank umzubenennen. Dann erstellte eine Datenbank mit dem gleichen Namen.
Dadurch wurden Fremdschlüsseleinschränkungen auf denselben Datenbanknamen beschränkt, sodass die umbenannte Datenbank (z. B. my_db_renamed) Fremdschlüsseleinschränkungen in der neu erstellten Datenbank (my_db) aufwies.
Ich bin mir nicht sicher, ob dies ein Fehler in Sequel Pro ist oder ob ein Anwendungsfall dieses Verhalten erfordert, aber es hat mich den größten Teil eines Morgens gekostet: /
quelle
Ich hatte den gleichen Fehler. In meinem Fall war der Grund für den Fehler, dass ich eine ON DELETE SET NULL-Anweisung in der Einschränkung hatte, während das Feld, für das ich die Einschränkung in ihre Definition eingefügt habe, eine NOT NULL-Anweisung hatte. Das Zulassen von NULL im Feld löste das Problem.
quelle
Ich habe diese Art von Problem beim Erstellen der Datenbank aus der Textdatei festgestellt.
Ich habe gerade die obigen Zeilen geschrieben
Create.bat
und die Fledermausdatei 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 der Ausführung wird nach der Referenztabelle gesucht, Tabellen sind jedoch nicht vorhanden. Es wird also diese Art von Fehler zurückgeben.
quelle
Ich hatte ein ähnliches Problem, aber mein Problem war, dass ich einer vorhandenen Tabelle mit Daten ein neues Feld hinzufügte und das neue Feld auf ein anderes Feld aus der übergeordneten Tabelle verwies und außerdem die Definition NOT NULL und ohne STANDARDWERTE hatte. - Ich fand heraus, warum die Dinge nicht funktionierten, weil
Es ist wichtig zu bedenken, 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 wird
Der einfachere Ansatz, um dieses Problem zu vermeiden, ist zu
Ich hoffe das hilft jemandem
quelle
Vielleicht dies wird dazu beitragen? Die Definition der Primärschlüsselspalte sollte genau mit der Fremdschlüsselspalte übereinstimmen.
quelle
Stellen Sie sicher, dass alle Tabellen Fremdschlüssel unterstützen - InnoDB-Engine
quelle
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.
quelle
Ich hatte ein ähnliches Problem beim Speichern einer Django-MySQL-Datenbank mit einer einzelnen Tabelle. Ich konnte das Problem beheben, indem ich die Datenbank in eine Textdatei kopierte, die betreffende Tabelle mit Emacs an das Ende der Datei verschob und die geänderte SQL-Dump-Datei in die neue Instanz importierte.
HTH Uwe
quelle
Ich habe das Problem behoben, indem ich die Variable akzeptiert habe
null
quelle
Ich habe das gleiche Problem beim Ausführen einer Reihe von MySQL-Befehlen. Meins tritt beim Erstellen einer Tabelle auf, wenn ein Fremdschlüssel auf eine andere Tabelle verwiesen wird, die noch nicht erstellt wurde. Es ist die Reihenfolge der Tabellenexistenz vor dem Referenzieren.
Die Lösung: Erstellen Sie zuerst die übergeordneten Tabellen, bevor Sie eine untergeordnete Tabelle mit einem Fremdschlüssel erstellen.
quelle
Erstellen Sie die Tabelle ohne Fremdschlüssel und legen Sie den Fremdschlüssel separat fest.
quelle