Ich versuche, mein neues Schema auf meinen Datenbankserver weiterzuleiten, kann aber nicht herausfinden, warum ich diesen Fehler erhalte. Ich habe versucht, hier nach der Antwort zu suchen, aber alles, was ich gefunden habe, besagt, dass entweder die Datenbank-Engine auf Innodb gesetzt werden soll oder dass die Schlüssel, die ich als Fremdschlüssel verwenden möchte, Primärschlüssel in ihren eigenen Tabellen sind . Ich habe beide Dinge getan, wenn ich mich nicht irre. Irgendeine andere Hilfe, die ihr anbieten könntet?
Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
`Clients_Case_Number` INT NOT NULL ,
`Staff_Emp_ID` INT NOT NULL ,
PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
CONSTRAINT `fk_Clients_has_Staff_Clients`
FOREIGN KEY (`Clients_Case_Number` )
REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Clients_has_Staff_Staff1`
FOREIGN KEY (`Staff_Emp_ID` )
REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
SQL-Skriptausführung beendet: Anweisungen: 7 erfolgreich, 1 fehlgeschlagen
Hier ist die SQL für die übergeordneten Tabellen.
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
`Case_Number` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
`Address` CHAR(50) NULL ,
`Phone_Number` INT(10) NULL ,
PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
`Emp_ID` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB
mysql
foreign-keys
Robert B.
quelle
quelle
Clients
undStaff
.Antworten:
Ich vermute, dass
Clients.Case_Number
und / oderStaff.Emp_ID
nicht genau der gleiche Datentyp wieClients_has_Staff.Clients_Case_Number
und sindClients_has_Staff.Staff_Emp_ID
.Vielleicht sind die Spalten in den übergeordneten Tabellen
INT UNSIGNED
?Sie müssen in beiden Tabellen genau den gleichen Datentyp haben.
quelle
Table
CHARACTER SET = utf8 zu beheben; und ALTER TABLEDevice
CHANGE COLUMNID
ID
CHAR (36) CHARACTER SET 'utf8' NOT NULL;Gründe, warum möglicherweise ein Fremdschlüsseleinschränkungsfehler auftritt:
Aktualisieren:
ON DELETE SET NULL
nicht als null definiert ist. Stellen Sie daher sicher, dass die Spalte auf Null gesetzt ist.Überprüfen Sie diese.
quelle
Bei anderen ist der gleiche Fehler möglicherweise nicht immer auf eine Nichtübereinstimmung des Spaltentyps zurückzuführen. Weitere Informationen zu einem MySQL-Foriegn-Schlüsselfehler erhalten Sie durch Ausgabe des Befehls
Möglicherweise finden Sie oben in der gedruckten Nachricht einen Fehler wie z
quelle
Fehler 1215 ist ärgerlich. Antwort der Explosionspille deckt die Grundlagen ab. Sie möchten sicherstellen, dass Sie von dort aus beginnen. Es gibt jedoch viel, viel subtilere Fälle, auf die Sie achten müssen:
Wenn Sie beispielsweise versuchen, PRIMARY KEYs verschiedener Tabellen zu verknüpfen, stellen Sie sicher, dass Sie die richtigen Optionen
ON UPDATE
undON DELETE
Optionen angeben . Z.B:wird nicht fliegen, weil PRIMARY KEYs (wie
id
) nicht sein könnenNULL
.Ich bin sicher, dass es beim Hinzufügen dieser Art von Einschränkungen noch mehr, ähnlich subtile Probleme gibt. Wenn Sie daher auf Einschränkungsfehler stoßen, stellen Sie immer sicher, dass die Einschränkungen und ihre Auswirkungen in Ihrem aktuellen Kontext sinnvoll sind. Viel Glück mit Ihrem Fehler 1215!
quelle
ON DELETE SET NULL
für eine Spalte zu erstellen, die ich sein wollteNOT NULL
. Angenommen, Sie können Ihren Kuchen nicht haben und ihn auch nicht essen.Überprüfen Sie die Sortierung der Tabelle mit
SHOW TABLE STATUS
Informationen können Sie Informationen zu den Tabellen einschließlich der Sortierung überprüfen.Beide Tabellen müssen dieselbe Sortierung haben.
Es ist mir passiert.
quelle
In meinem Fall hatte ich eine Tabelle mit
SET FOREIGN_KEY_CHECKS=0
und danach gelöschtSET FOREIGN_KEY_CHECKS=1
. Als ich den Tisch nachladen wollte, bekam icherror 1215
. Das Problem war, dass es eine andere Tabelle in der Datenbank gab, die einen Fremdschlüssel für die Tabelle hatte, die ich gelöscht hatte und die neu geladen wurde. Ein Teil des Neuladevorgangs bestand darin, einen Datentyp für eines der Felder zu ändern, wodurch der Fremdschlüssel aus der anderen Tabelle ungültig wurde und somit ausgelöst wurdeerror 1215
. Ich habe das Problem gelöst, indem ich die andere Tabelle mit dem neuen Datentyp für das betroffene Feld gelöscht und dann neu geladen habe.quelle
Bei der Verwendung von Laravel 4 ist eine Gefahr aufgetreten, die ich bei "Fehler 1215: Fremdschlüsseleinschränkung kann nicht hinzugefügt werden" festgestellt habe, insbesondere bei den Laravel 4-Generatoren von JeffreyWay.
In Laravel 4 können Sie mit den Generatoren von JeffreyWay Migrationsdateien generieren, um Tabellen einzeln zu erstellen. Das bedeutet, dass jede Migrationsdatei eine Tabelle generiert. Sie müssen sich der Tatsache bewusst sein, dass jede Migrationsdatei mit einem Zeitstempel im Dateinamen generiert wird, der den Dateien eine Reihenfolge gibt. Die Reihenfolge der Generierung ist auch die Reihenfolge der Migrationsvorgänge, wenn Sie den Artisan CLI-Befehl "php artisan migrate" auslösen. Wenn eine Datei nach einer Fremdschlüsseleinschränkung fragt, die sich auf einen Schlüssel bezieht, der in einer letzteren Datei generiert, aber noch nicht generiert wird, wird der Fehler 1215 ausgelöst. In diesem Fall müssen Sie die Reihenfolge der Generierung der Migrationsdateien anpassen. Generieren Sie neue Dateien in der richtigen Reihenfolge, kopieren Sie den Inhalt und löschen Sie die ungeordneten alten Dateien.
quelle
Ich habe den gleichen Fehler beim Versuch, ein fk hinzuzufügen. In meinem Fall wurde das Problem durch die PK der FK-Tabelle verursacht, die als nicht signiert markiert war.
quelle
Ich hatte das gleiche Problem, meine Lösung:
Vor:
Lösung:
Ich hoffe es ist Hilfe;)
quelle
Ich hatte das gleiche Problem.
Ich habe es dabei gelöst:
Ich habe die folgende Zeile in der erstellt
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)
Ich habe diese Lösung herausgefunden, nachdem ich versucht hatte, eine Tabelle in meinen Schema-Builder zu importieren. Wenn es für Sie funktioniert, lassen Sie es mich wissen!
Viel Glück!
Felipe Tércio
quelle
Ich wollte diesen Fall nur auch für die
VARCHAR
Fremdschlüsselbeziehung hinzufügen . Ich habe die letzte Woche damit verbracht, dies in MySQL Workbench 8.0 herauszufinden, und konnte den Fehler endlich beheben.Kurze Antwort: Der Zeichensatz und die Sortierung des Schemas, der Tabelle, der Spalte, der Referenzierungstabelle, der Referenzierungsspalte und aller anderen Tabellen, die auf die übergeordnete Tabelle verweisen, müssen übereinstimmen.
Lange Antwort: Ich hatte einen ENUM-Datentyp in meiner Tabelle. Ich habe dies in geändert
VARCHAR
und kann die Werte aus einer Referenztabelle abrufen, sodass ich die übergeordnete Tabelle nicht ändern muss, um zusätzliche Optionen hinzuzufügen. Diese Fremdschlüsselbeziehung schien unkompliziert zu sein, aber ich habe 1215 Fehler erhalten. Die Antwort von arvind und der folgende Link schlugen die Verwendung von vorBei Verwendung dieses Befehls erhielt ich die folgende ausführliche Beschreibung des Fehlers ohne zusätzliche hilfreiche Informationen
Danach habe ich
SET FOREIGN_KEY_CHECKS=0;
wie von Arvind Bharadwaj vorgeschlagen und den Link hier verwendet :Dies ergab die folgende Fehlermeldung:
Zu diesem Zeitpunkt habe ich das Schema rückentwickelt und konnte die Fremdschlüsselbeziehung im EER-Diagramm herstellen. Beim 'Forward Engineering' wurde der folgende Fehler angezeigt:
Als ich das EER-Diagramm an ein neues Schema weiterleitete, lief das SQL-Skript ohne Probleme. Beim Vergleich des generierten SQL aus den Versuchen, den Ingenieur weiterzuleiten, stellte ich fest, dass der Unterschied im Zeichensatz und in der Sortierung lag. Die übergeordnete Tabelle, die untergeordnete Tabelle und die beiden Spalten hatten
utf8mb4
Zeichensatz undutf8mb4_0900_ai_ci
Sortierung. Es wurde jedoch mit auf eine andere Spalte in der übergeordneten Tabelle verwiesenCHARACTER SET = utf8 , COLLATE = utf8_bin ;
einer anderen untergeordneten Tabelle .Für das gesamte Schema habe ich den Zeichensatz und die Sortierung für alle Tabellen und Spalten wie folgt geändert:
Dies löste schließlich mein Problem mit 1215 Fehler.
Randnotiz: Die Sortierung
utf8mb4_general_ci
funktioniert in MySQL Workbench 5.0 oder höher. Die Sortierungutf8mb4_0900_ai_ci
funktioniert nur für MySQL Workbench 8.0 oder höher. Ich glaube, einer der Gründe, warum ich Probleme mit dem Zeichensatz und der Sortierung hatte, ist das dazwischen liegende Upgrade der MySQL Workbench auf 8.0. Hier ist ein Link , der mehr über diese Zusammenstellung spricht.quelle
Ich kann diesen Fehler nicht finden
quelle
Dies geschieht auch, wenn der Typ der Spalten nicht identisch ist.
Wenn beispielsweise die Spalte, auf die Sie sich beziehen, UNSIGNED INT ist und die Spalte, auf die verwiesen wird, INT ist, wird dieser Fehler angezeigt.
quelle
Für MySQL (INNODB) ... Definitionen für Spalten abrufen, die Sie verknüpfen möchten
Vergleichen und überprüfen Sie beide Spaltendefinitionen
könnte hilfreich sein, um wie zu spielen
quelle
Überprüfen Sie die Tabellenkompatibilität. Wenn beispielsweise eine Tabelle
MyISAM
und die andere Tabelle vorhanden istInnoDB
, liegt möglicherweise dieses Problem vor.quelle
Ein weiterer Grund: Wenn Sie
ON DELETE SET NULL
alle Spalten verwenden, die im Fremdschlüssel verwendet werden, müssen Nullwerte zulässig sein. Jemand anderes hat dies in dieser Frage herausgefunden .Nach meinem Verständnis wäre dies kein Problem hinsichtlich der Datenintegrität, aber es scheint, dass MySQL diese Funktion einfach nicht unterstützt (in 5.7).
quelle
Wenn dieser Fehler auftritt, weil die referenzierte Tabelle die MyISAM-Engine verwendet, bietet diese Antwort eine schnelle Möglichkeit, Ihre Datenbank zu konvertieren, sodass alle Django-Modelltabellen InnoDB verwenden: https://stackoverflow.com/a/15389961/2950621
Es ist ein Django-Verwaltungsbefehl namens convert_to_innodb.
quelle
Wooo, ich habe es gerade verstanden! Es war eine Mischung aus vielen bereits veröffentlichten Antworten (innoDB, unsigned usw.). Eine Sache, die ich hier jedoch nicht gesehen habe, ist: Wenn Ihre FK auf eine PK zeigt, stellen Sie sicher, dass die Quellenspalte einen sinnvollen Wert hat. Wenn die PK beispielsweise eine Mediumint (8) ist, stellen Sie sicher, dass die Quellenspalte auch eine Mediumint (8) enthält. Das war ein Teil des Problems für mich.
quelle
Für mich waren es die Spaltentypen. BigINT! = INT.
Aber dann hat es immer noch nicht funktioniert.
Also habe ich die Motoren überprüft. Stellen Sie sicher, dass Table1 = InnoDB und Table = InnoDB
quelle
Ich habe diesen Fehler aus einem ganz anderen Grund erlebt. Ich habe MySQL Workbench 6.3 zum Erstellen meines Datenmodells verwendet (fantastisches Tool). Ich habe festgestellt, dass dieser Fehler auch generiert wird, wenn die in der Definition der Fremdschlüsseleinschränkung definierte Spaltenreihenfolge nicht zur Tabellenspaltenfolge passt.
Ich habe ungefähr 4 Stunden gebraucht, um alles andere auszuprobieren, außer das zu überprüfen.
Jetzt funktioniert alles gut und ich kann wieder mit dem Codieren beginnen. :-)
quelle
Wenn Sie versuchen, bei Verwendung der Laravel-Migration einen Fremdschlüssel zu erstellen
wie dieses Beispiel:
Benutzertabelle
Farbtabelle
Manchmal funktionierten die Eigenschaften nicht
Dieser Fehler ist aufgetreten, weil der Fremdschlüssel (Typ) in [Benutzertabelle] vom Primärschlüssel (Typ) in [Farbtabelle] abweicht.
Um dieses Problem zu lösen, sollte der Primärschlüssel in [Farbtabelle] geändert werden.
$table->tinyIncrements('id');
Wenn Sie den Primärschlüssel verwenden
$table->Increments('id');
Sie sollten
Integer
als Fremdschlüssel verwendenWenn Sie den Primärschlüssel verwenden
$table->tinyIncrements('id');
Sie sollten
unsignedTinyInteger
als Fremdschlüssel verwendenWenn Sie den Primärschlüssel verwenden
$table->smallIncrements('id');
Sie sollten
unsignedSmallInteger
als Fremdschlüssel verwendenWenn Sie den Primärschlüssel verwenden
$table->mediumIncrements('id');
Sie sollten
unsignedMediumInteger
als Fremdschlüssel verwendenquelle
bigIncrements
als Primärschlüssel, also musste ichunsignedBigInteger
In meinem Fall musste ich
FOREIGN KEY
Überprüfungen deaktivieren , da die Quelltabellen nicht vorhanden waren.SET FOREIGN_KEY_CHECKS=0;
quelle
Beachten Sie auch die Verwendung von Backquotes. Ich hatte in einem Skript die folgende Aussage
aber die Rückzitate am Ende waren falsch. Es hätte sein sollen:
MySQL gibt leider keine Details zu diesem Fehler ...
quelle
Eine weitere Ursache für diesen Fehler ist, dass Sie zwei oder mehr gleiche Tabellennamen mit denselben Fremdschlüsselnamen haben. Dies passiert manchmal Personen, die Modellierungs- und Entwurfssoftware wie MySQL Workbench verwenden und später das Skript aus dem Entwurf generieren.
quelle
Ich weiß, dass ich sehr spät zur Party komme, aber ich möchte es hier veröffentlichen, damit es aufgelistet wird.
Stellen Sie neben allen oben genannten Hinweisen zur Sicherstellung, dass Felder identisch definiert sind und Tabellentypen auch dieselbe Sortierung aufweisen, sicher, dass Sie nicht den Anfängerfehler machen, wenn Sie versuchen, Felder zu verknüpfen, bei denen Daten im Feld CHILD nicht vorhanden sind bereits im Feld ELTERN. Wenn Sie Daten im Feld CHILD haben, die Sie noch nicht in das Feld PARENT eingegeben haben, führt dies zu diesem Fehler. Es ist eine Schande, dass die Fehlermeldung nicht ein bisschen hilfreicher ist.
Wenn Sie sich nicht sicher sind, sichern Sie die Tabelle mit dem Fremdschlüssel, löschen Sie alle Daten und versuchen Sie dann, den Fremdschlüssel zu erstellen. Wenn erfolgreich, dann was zu tun!
Viel Glück.
quelle
Dies ist eine subtile Version dessen, was bereits gesagt wurde, aber in meinem Fall hatte ich 2 Datenbanken (foo und bar). Ich habe zuerst foo erstellt und nicht bemerkt, dass es auf einen Fremdschlüssel in bar.baz verweist (der noch nicht erstellt wurde). Als ich versuchte, bar.baz (ohne Fremdschlüssel) zu erstellen, wurde dieser Fehler immer wieder angezeigt. Nachdem ich mich eine Weile umgesehen hatte, fand ich den Fremdschlüssel in foo.
Kurz gesagt: Wenn Sie diesen Fehler erhalten, ist möglicherweise ein Fremdschlüssel für die zu erstellende Tabelle vorhanden.
quelle
Bei mir trat der 1215-Fehler auf, als ich ein von erstelltes Dumpfile importierte
mysqldump
, das die Tabellen alphabetisch erstellt, was in meinem Fall dazu führte, dass Fremdschlüssel auf später in der Datei erstellte Tabellen verweisen. (Requisiten auf dieser Seite, um darauf hinzuweisen: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/ )Da mysqldump Tabellen alphabetisch ordnet und ich die Namen von Tabellen nicht ändern wollte, befolgte ich die Anweisungen in der Antwort von JeremyWeir auf dieser Seite , die besagt, dass sie
set FOREIGN_KEY_CHECKS = 0;
oben in die Speicherauszugsdatei undSET FOREIGN_KEY_CHECKS = 1;
unten in die Speicherauszugsdatei eingefügt werden sollen .Diese Lösung hat bei mir funktioniert.
quelle
Also habe ich alle oben genannten Korrekturen ausprobiert und kein Glück. Möglicherweise fehlt der Fehler in meinen Tabellen. Ich konnte die Ursache nicht finden und habe immer wieder den Fehler 1215 erhalten. Also habe ich diesen Fix verwendet.
In meiner lokalen Umgebung in phpMyAdmin habe ich Daten aus der betreffenden Tabelle exportiert. Ich habe das Format CSV ausgewählt. Während ich mich noch in phpMyAdmin mit der ausgewählten Tabelle befand, wählte ich "Mehr-> Optionen". Hier habe ich nach unten zu "Tabelle kopieren nach (database.table) gescrollt. Wählen Sie" Nur Struktur ". Benennen Sie die Tabelle um, fügen Sie möglicherweise einfach das Wort" Kopieren "neben dem aktuellen Tabellennamen hinzu. Klicken Sie auf" Los ". Dadurch wird eine neue erstellt Tabelle. Exportieren Sie die neue Tabelle und importieren Sie sie auf den neuen oder einen anderen Server. Ich verwende auch hier phpMyAdmin. Ändern Sie nach dem Importieren den Namen der Tabelle wieder in den ursprünglichen Namen. Wählen Sie die neue Tabelle aus, wählen Sie Importieren. Wählen Sie für das Format CSV Deaktivieren Sie "Fremdschlüsselprüfungen aktivieren". Wählen Sie "Los". Bisher funktioniert alles einwandfrei.
Ich habe mein Update in meinem Blog veröffentlicht .
quelle
Sogar ich hatte das gleiche Problem. Und der Fehler war mit dem "vorzeichenlosen" Marker in der Tabelle PK der FK
quelle
Ich hatte einmal den gleichen Fehler. Ich habe einfach den MySQL-Server neu gestartet und das Problem behoben.
quelle