it-swarm.com.de

MySQL-Fehler 1215: Fremdschlüsseleinschränkung kann nicht hinzugefügt werden

Ich versuche, mein neues Schema auf meinen Datenbankserver weiterzuleiten, aber ich kann nicht herausfinden, warum ich diesen Fehler erhalte. Ich habe versucht, nach der Antwort hier zu suchen, aber alles, was ich gefunden habe, hat gesagt, entweder die Datenbank-Engine auf Innodb zu setzen oder sicherzustellen, dass die Schlüssel, die ich als Fremdschlüssel verwenden möchte, Primärschlüssel in ihren eigenen Tabellen sind . Ich habe beides getan, wenn ich mich nicht irre. Könntest du andere Hilfe anbieten?

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-Skript-Ausfü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
275
Robert B

Ich vermute, dass Clients.Case_Number und/oder Staff.Emp_ID nicht exakt der gleiche Datentyp wie Clients_has_Staff.Clients_Case_Number und Clients_has_Staff.Staff_Emp_ID sind.

Möglicherweise sind die Spalten in den übergeordneten Tabellen INT UNSIGNED?

Sie müssen in beiden Tabellen exakt denselben Datentyp haben.

496
Ike Walker

Gründe, warum Sie möglicherweise einen Fremdschlüsseleinschränkungsfehler erhalten:

  1. Sie verwenden InnoDB nicht als Engine für alle Tabellen.
  2. Sie versuchen, auf einen nicht vorhandenen Schlüssel in der Zieltabelle zu verweisen. Stellen Sie sicher, dass es sich um einen key in der anderen Tabelle handelt (es kann sich um einen Primärschlüssel oder einen eindeutigen Schlüssel handeln).
  3. Die Arten der Spalten sind nicht gleich (Ausnahme: Die Spalte in der referenzierenden Tabelle kann null sein).
  4. Wenn der PK/FK ein varchar ist, stellen Sie sicher, dass die Sortierung für beide gleich ist.

Update:

  1. Einer der Gründe kann auch sein, dass die Spalte, die Sie für ON DELETE SET NULL verwenden, nicht als null definiert ist. Stellen Sie daher sicher, dass die Spalte als Standardwert null festgelegt ist.

Überprüfen Sie diese.

199
Explosion Pills

Für andere kann der gleiche Fehler nicht immer auf einen fehlenden Spaltentyp zurückzuführen sein. Sie können weitere Informationen zu einem mysql foriegn-Schlüsselfehler durch Ausgeben des Befehls erfahren

SHOW ENGINE INNODB STATUS;

möglicherweise finden Sie einen Fehler in der Nähe der gedruckten Nachricht

In der referenzierten Tabelle kann kein Index gefunden werden, in dem die referenzierte Spalten werden als erste Spalten oder Spaltentypen angezeigt in der Tabelle und der referenzierten Tabelle stimmen nicht mit der Einschränkung überein.

74
arvind

Fehler 1215 ist ärgerlich. Die Antwort der Explosionspille deckt die Grundlagen ab. Sie möchten sicherstellen, dass Sie von dort aus beginnen. Es gibt jedoch mehr, viel subtilere Fälle, auf die Sie achten sollten:

Wenn Sie beispielsweise versuchen, PRIMARY KEYs verschiedener Tabellen zu verknüpfen, stellen Sie sicher, dass Sie die richtigen Optionen ON UPDATE und ON DELETE angeben. Z.B.:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

kann nicht fliegen, da PRIMARY KEYs (wie id) nicht NULL sein können.

Ich bin sicher, es gibt noch mehr, ähnlich subtile Probleme beim Hinzufügen dieser Art von Einschränkungen. Wenn Sie also auf Fehler stoßen, stellen Sie sicher, dass die Einschränkungen und ihre Auswirkungen in Ihrem aktuellen Kontext sinnvoll sind. Viel Glück mit deinem Fehler 1215!

12
Domi

Überprüfen Sie die Sortierung der Tabelle. Mit SHOW TABLE STATUS können Sie Informationen zu den Tabellen einschließlich der Sortierung prüfen.

Beide Tabellen müssen die gleiche Sortierung haben.

Es ist mir passiert. 

7
Carlos Laspina

In meinem Fall hatte ich eine Tabelle mit SET FOREIGN_KEY_CHECKS=0 und danach SET FOREIGN_KEY_CHECKS=1 gelöscht. Als ich die Tabelle neu laden wollte, bekam ich error 1215. Das Problem bestand darin, dass sich in der Datenbank eine andere Tabelle befand, die einen Fremdschlüssel zu der von mir gelöschten Tabelle enthielt und neu geladen wurde. Ein Teil des Neuladevorgangs beinhaltete das Ändern eines Datentyps für eines der Felder, wodurch der Fremdschlüssel aus der anderen Tabelle ungültig wurde und error 1215 ausgelöst wurde. Ich habe das Problem behoben, indem ich die andere Tabelle mit dem neuen Datentyp für das betreffende Feld gelöscht und erneut geladen habe.

7
CodeMed

Es gibt eine Falle, die ich mit "Fehler 1215: Fremdschlüsseleinschränkung kann nicht hinzufügen" bei der Verwendung von Laravel 4, insbesondere mit den Laravel 4-Generatoren von JeffreyWay, erlebt.

In Laravel 4 können Sie mit den Generatoren von JeffreyWay Migrationsdateien generieren, um Tabellen einzeln zu erstellen, dh jede Migrationsdatei generiert eine Tabelle ..__ Sie müssen sich der Tatsache bewusst sein, dass jede Migrationsdatei mit generiert wird Ein Zeitstempel im Dateinamen, der den Dateien eine Reihenfolge gibt. Die Reihenfolge der Generierung ist auch die Reihenfolge des Migrationsvorgangs, wenn Sie den Artisan CLI-Befehl "php artisan migrate" auslösen. Wenn also eine Datei nach einer Fremdschlüsseleinschränkung fragt, die sich auf einen Schlüssel bezieht, wird dies noch nicht geschehen. In einer letzteren Datei 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.

5
user2975399

Ich habe die gleiche Fehlermeldung erhalten, als ich versuchte, eine fk hinzuzufügen. In meinem Fall wurde das Problem durch den PK der FK-Tabelle verursacht, der als nicht signiert gekennzeichnet war.

4
Alex

Ich hatte das gleiche problem.
Ich habe es so gelöst:

Ich habe die folgende Zeile im erstellt
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

Ich fand diese Lösung heraus, nachdem ich versucht hatte, eine Tabelle in meinen Schema-Builder zu importieren. Wenn es bei Ihnen funktioniert, lassen Sie es mich wissen!

Viel Glück!

Felipe Tércio

3
user3478348

Ein weiterer Grund: Wenn Sie ON DELETE SET NULLverwenden, müssen alle -Spalten, die im Fremdschlüssel verwendet werden, Nullwerte zulassen. Jemand anderes hat dies in dieser Frage herausgefunden. 

Nach meinem Verständnis wäre dies kein Problem in Bezug auf die Datenintegrität, aber MySQL scheint diese Funktion einfach nicht zu unterstützen (in 5.7).

2
robsch

Überprüfen Sie die Kompatibilität der Tabellen. Wenn beispielsweise eine Tabelle MyISAM und die andere Tabelle InnoDB ist, kann dieses Problem auftreten.

2
Dennis

Für MySQL (INNODB) ... erhalten Sie Definitionen für Spalten, die Sie verknüpfen möchten

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

vergleichen und überprüfen Sie beide Spaltendefinitionen 

gleiche COLUMN_TYPE (Länge), gleiche COLATION 

könnte hilfreich sein, um zu spielen

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;
2
bortunac

Ich kann diesen Fehler nicht finden

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)
2
gathila

Dies geschieht auch, wenn der Typ der Spalten nicht derselbe ist.

z.B. Wenn die Spalte, auf die Sie sich beziehen, UNSIGNED INT ist und die Spalte, auf die verwiesen wird, INT lautet, wird dieser Fehler angezeigt.

2
Mozaffar

ich hatte das gleiche Problem, meine Lösung:

Vor:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

Lösung:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

Ich hoffe es hilft;)

2

Ich habe diesen Fehler aus einem ganz anderen Grund erfahren. Ich habe MySQL Workbench 6.3 zum Erstellen meines Datenmodells (awesome tool) verwendet. Ich habe festgestellt, dass dieser Fehler ebenfalls generiert wird, wenn die in der Fremdschlüsseleinschränkungsdefinition definierte Spaltenreihenfolge nicht in die Tabellenspaltenfolge passt.

Ich brauchte ungefähr vier Stunden, um alles andere auszuprobieren, als das zu überprüfen.

Jetzt funktioniert alles gut und ich kann wieder mit dem Programmieren beginnen. :-)

1
Stephen Nortje

Wooo ich habe es gerade bekommen! Es war eine Mischung aus vielen bereits geposteten Antworten (innoDB, unsigniert usw.). Eine Sache, die ich hier nicht gesehen habe, ist: Wenn Ihr FK auf eine PK zeigt, stellen Sie sicher, dass die Quellspalte einen sinnvollen Wert hat. Wenn der PK beispielsweise ein Medium ist (8), müssen Sie sicherstellen, dass die Quellenspalte auch ein Medium (8) enthält. Das war für mich ein Teil des Problems.

1
Chris Neve

Für mich waren es die Säulentypen. 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 ist

1
Chad

Wenn dieser Fehler auftritt, weil die referenzierte Tabelle die MyISAM-Engine verwendet, bietet diese Antwort eine schnelle Möglichkeit zum Konvertieren Ihrer Datenbank, sodass alle Django-Modelltabellen InnoDB verwenden: https://stackoverflow.com/a/15389961/2950621

Es ist ein Django-Verwaltungsbefehl namens convert_to_innodb.

1
nmgeek

Ich wollte nur diesen Fall für 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 Sortierfolge des Schemas, der Tabelle, der Spalte, der referenzierenden Tabelle, der referenzierenden Spalte 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 VARCHAR geändert 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, aber ich habe den Fehler 1215 erhalten. arvind s Antwort und der folgende link schlug die Verwendung von 

SHOW ENGINE INNODB STATUS;

Bei Verwendung dieses Befehls erhielt ich die folgende ausführliche Beschreibung für den Fehler ohne zusätzliche hilfreiche Informationen

In der referenzierten Tabelle kann kein Index gefunden werden, in dem die referenzierte Spalten werden als erste Spalten oder Spaltentypen angezeigt in der Tabelle und der referenzierten Tabelle stimmen nicht mit der Einschränkung überein. Beachten Sie, dass sich der interne Speichertyp von ENUM und SET in .__ geändert hat. Tabellen, die mit> = InnoDB-4.1.12 erstellt wurden, und solche Spalten in alten Tabellen In neuen Tabellen können diese Spalten nicht referenziert werden. Die korrekte Definition des Fremdschlüssels finden Sie unter http://dev.mysql.com/doc/refman/8.0/de/innodb-foreign-key-constraints.html .

Danach benutzte ich SET FOREIGN_KEY_CHECKS=0; wie von Arvind Bharadwaj und den Link hier vorgeschlagen :

Dies gab die folgende Fehlermeldung:

Fehlercode: 1822. Fehler beim Hinzufügen der Fremdschlüsseleinschränkung. Fehlt Index für Einschränkung

An diesem Punkt habe ich das Schema „zurückentwickelt“ und konnte die Fremdschlüsselbeziehung im EER-Diagramm erstellen. Beim 'Forward Engineer' habe ich folgende Fehlermeldung erhalten:

Fehler 1452: Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: eine Fremdschlüsseleinschränkung schlägt fehl

Wenn ich das EER-Diagramm auf ein neues Schema weiterleitete, lief das SQL-Skript ohne Probleme. Beim Vergleich der generierten SQL aus den Versuchen des Forward Engineerings stellte ich fest, dass der Unterschied in Zeichensatz und Sortierung lag. Die übergeordnete Tabelle, die untergeordnete Tabelle und die beiden Spalten hatten utf8mb4-Zeichensatz und utf8mb4_0900_ai_ci-Sortierung. Eine andere Spalte in der übergeordneten Tabelle wurde jedoch mit CHARACTER SET = utf8 , COLLATE = utf8_bin ; auf eine andere untergeordnete Tabelle verwiesen.

Für das gesamte Schema habe ich den Zeichensatz und die Sortierung für alle Tabellen und alle Spalten wie folgt geändert:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Dies löste schließlich mein Problem mit dem 1215-Fehler.

Side Hinweis: Die Kollatierung utf8mb4_general_ci funktioniert in MySQL Workbench 5.0 oder höher. Die Sortierung utf8mb4_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 Sortierfolge hatte, ist das MySQL Workbench-Upgrade auf 8.0 dazwischen. Hier ist ein link der mehr über diese Kollatierung spricht.

1
CoderBapu

In meinem Fall musste ich FOREIGN KEY Prüfungen deaktivieren, da die Quelltabellen nicht vorhanden waren.

SET FOREIGN_KEY_CHECKS=0;

0
Arvind Bhardwaj

Dies ist eine subtile Version von dem, was bereits gesagt wurde, aber in meinem Fall hatte ich 2 Datenbanken (foo und bar). Ich habe zuerst foo erstellt und wusste nicht, dass es sich auf einen Fremdschlüssel in bar.baz bezieht (der noch nicht erstellt wurde). Beim Versuch, bar.baz (ohne Fremdschlüssel) zu erstellen, wurde diese Fehlermeldung immer wieder angezeigt. Nachdem ich mich eine Weile umgesehen hatte, fand ich den Fremdschlüssel in foo.

Um es kurz zu machen: Wenn Sie diesen Fehler erhalten, haben Sie möglicherweise einen bereits vorhandenen Fremdschlüssel für die zu erstellende Tabelle.

0
ajon

Beachten Sie auch die Verwendung von Backquotes. Ich hatte die folgende Aussage in einem Skript

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

aber die Backquotes am Ende waren falsch. Es hätte sein sollen:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

MySQL gibt leider keine Details zu diesem Fehler ...

0

wenn Sie versuchen, einen Fremdschlüssel zu erstellen, wenn Sie laravel migration verwenden

wie dieses Beispiel:

benutzertabelle

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

farbtabelle

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

manchmal funktionierten die Eigenschaften nicht

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

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');


Bei Verwendung des Primärschlüssels $table->Increments('id');

sie sollten Integer als Fremdschlüssel verwenden

    $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Bei Verwendung des Primärschlüssels $table->tinyIncrements('id');

sie sollten unsignedTinyInteger als Fremdschlüssel verwenden

    $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Bei Verwendung des Primärschlüssels $table->smallIncrements('id');

sie sollten unsignedSmallInteger als Fremdschlüssel verwenden

    $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Bei Verwendung des Primärschlüssels $table->mediumIncrements('id');

sie sollten unsignedMediumInteger als Fremdschlüssel verwenden

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');
0

Ich weiß, dass ich sehr spät zur Party bin, aber ich möchte es hier veröffentlichen, damit es aufgeführt wird.

Stellen Sie sicher, dass neben den oben genannten Hinweisen, die sicherstellen, dass Felder identisch definiert sind und Tabellentypen die gleiche Sortierung aufweisen, nicht der Anfängerfehler gemacht wird, wenn Sie versuchen, Felder zu verknüpfen, bei denen Daten im Feld CHILD nicht vorhanden sind bereits im elterlichen Feld. Wenn sich Daten im Feld CHILD befinden, die Sie noch nicht im 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, den Fremdschlüssel zu erstellen. Wenn erfolgreich, dann was Sie tun!

Viel Glück.

0
noowie

Bei mir trat der Fehler 1215 auf, als ich ein von mysqldump erstelltes Dumpfile importierte, das die Tabellen in alphabetischer Reihenfolge erstellt, was in meinem Fall dazu führte, dass Fremdschlüssel auf später in der Datei erstellte Referenztabellen verweisen. (Wir empfehlen diese Seite, um darauf hinzuweisen: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/ )

Da mysqldump die Tabellen alphabetisch ordnet und ich die Namen der Tabellen nicht ändern wollte, folgte ich den Anweisungen in der Antwort von JeremyWeir auf dieser Seite , in der angegeben ist, dass set FOREIGN_KEY_CHECKS = 0; am Anfang der Dump-Datei und SET FOREIGN_KEY_CHECKS = 1; an eingefügt werden soll das Ende der Dump-Datei.

Diese Lösung hat bei mir funktioniert.

0
Arya

Eine weitere Ursache für diesen Fehler ist, dass Sie mindestens zwei gleiche Tabellennamen mit denselben Fremdschlüsselnamen haben. Dies geschieht manchmal bei Benutzern, die Modellierungs- und Design-Software wie Mysql Workbench verwenden und später das Skript aus dem Design erstellen. 

0
Dima Dz

Hinzufügen eines weiteren Grundes zu @ Explosion Pills Antwort oben :

7- Bei Verwendung von mehrspaltigen Schlüsseln muss die Reihenfolge bei der Fremdschlüsselerstellung mit der anderen Reihenfolge in der Tabellenspalte übereinstimmen.

0
RADU