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

334

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
Robert B.
quelle
6
Bitte posten Sie das Schema für die übergeordneten Tabellen: Clientsund Staff.
Ike Walker
Ein mögliches Duplikat des MySQL-Fehlers kann keine Fremdschlüsseleinschränkung hinzufügen
Denis de Bernardy
1
@Denis ist wahrscheinlich kein Duplikat, da das OP angibt, dass die Spalten PKs in den übergeordneten Tabellen sind.
Ike Walker
Ich habe die SQL-Anweisungen für die Clients und Staff-Tabellen wie gewünscht hinzugefügt.
Robert B

Antworten:

591

Ich vermute, dass Clients.Case_Numberund / oder Staff.Emp_IDnicht genau der gleiche Datentyp wie Clients_has_Staff.Clients_Case_Numberund sind Clients_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.

Ike Walker
quelle
10
Vielen Dank. Dies stellte sich als Problem heraus. Staff.Emp_ID war eine SMALLINT, während die Referenzierungsspalte eine INT war. Manchmal sind es die kleinen Dinge ...
Robert B
Tks. In meinem Fall hatte ich versehentlich auf "ZeroFill" für den Fremdschlüssel in der untergeordneten Tabelle geklickt, was bedeutete, dass er nicht genau mit der Spalte der übergeordneten Tabelle übereinstimmte.
wwkudu
12
Es kann auch sein, dass der Zeichensatz unterschiedlich ist. Ich hatte dieses Problem, bei dem eine Spalte den Zeichensatz utf8 hatte, während die andere latin1 hatte. Einfach mit ALTER TABLE TableCHARACTER SET = utf8 zu beheben; und ALTER TABLE DeviceCHANGE COLUMN ID IDCHAR (36) CHARACTER SET 'utf8' NOT NULL;
www.jensolsson.se
3
@ www.jensolsson.se Sie haben Recht, wenn die PK eine oder mehrere Zeichenfolgenspalten enthält, müssen sie denselben Zeichensatz und dieselbe Sortierung verwenden. In diesem speziellen Fall war die PK eine INT, sodass der Zeichensatz der Tabelle und / oder Spalten nicht relevant war.
Ike Walker
2
Die Sortierung war mein Problem, latin1 vs utf8 (siehe Tabelle UND Spalte).
ben_979
244

Gründe, warum möglicherweise ein Fremdschlüsseleinschränkungsfehler auftritt:

  1. Sie verwenden InnoDB nicht für alle Tabellen als Engine.
  2. Sie versuchen, auf einen nicht vorhandenen Schlüssel in der Zieltabelle zu verweisen. Stellen Sie sicher, dass es sich um einen Schlüssel 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 identisch (Ausnahme ist, dass die Spalte in der Referenzierungstabelle nullwertfähig sein kann).
  4. Wenn der PK / FK ein Varchar ist, stellen Sie sicher, dass die Sortierung für beide gleich ist.

Aktualisieren:

  1. Einer der Gründe kann auch sein, dass die Spalte, für die Sie verwenden, ON DELETE SET NULLnicht als null definiert ist. Stellen Sie daher sicher, dass die Spalte auf Null gesetzt ist.

Überprüfen Sie diese.

Explosionspillen
quelle
14
Ich füge nur hinzu, dass, wenn sich die FK in einer Zeichenspalte befindet, sie meiner Meinung nach denselben Zeichensatz und dieselbe Sortierung haben müssen. (Oder möglicherweise sind 1-Byte- und 2-Byte-Zeichensätze nicht kompatibel.)
Graham Charles
5
Mein Grund war Ihr erster Hinweis "Verschiedene DB-Motoren für zwei Tabellen, InnoDB und MyISAM"
Randika Vishman
7
Ich habe einen anderen Grund =) `` `ON DELETE CASCADE ON UPDATE SET NULL:` `` Sie haben eine SET NULL-Bedingung definiert, obwohl einige der Spalten als NOT NULL definiert sind. Also korrigiere ich einfach die FK-Definition.
Alexglue
1
Ein möglicher Fehler ist auch das Fehlen eines Index für das Zielfeld.
Paul T. Rawkeen
1
schön, der 4. Punkt war mein Problem. Es ist irgendwie böse - aber ich bin sehr, sehr froh, dass MySQL dafür abgestürzt ist
Sebas
85

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

SHOW ENGINE INNODB STATUS;

Möglicherweise finden Sie oben in der gedruckten Nachricht einen Fehler wie z

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

arvind
quelle
13
Dies ist die beste Antwort, die ich denke, weil sie bei der Diagnose hilft! Vielen Dank.
Alexglue
Wie soll das gehen Beide Abfragen hintereinander ausführen?
C4d
@ C4u, ja, wir sollten beide Abfragen hintereinander ausführen, indem wir zuerst SHOW ENGINE INNODB STATUS und dann andere Abfragen haben
sureshd
Dies auf PHPMyAdmin zu tun, funktioniert nicht. Tun Sie es an der Eingabeaufforderung.
Ruwan800
13

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 UPDATEund ON DELETEOptionen angeben . Z.B:

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

wird nicht fliegen, weil PRIMARY KEYs (wie id) nicht sein können NULL.

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!

Domi
quelle
1
Sie erhalten diesen Fehler auch, wenn Sie versuchen, einen Fremdschlüssel zu löschen, der nicht vorhanden ist :)
Explosion Pills
2
Außerdem aus den Dokumenten: MySQL erfordert Indizes für Fremdschlüssel und referenzierte Schlüssel, damit Fremdschlüsselprüfungen schnell durchgeführt werden können und kein Tabellenscan erforderlich ist. In der Referenzierungstabelle muss ein Index vorhanden sein, in dem die Fremdschlüsselspalten als erste Spalten in derselben Reihenfolge aufgeführt sind . Ein solcher Index wird automatisch für die Referenzierungstabelle erstellt, wenn er nicht vorhanden ist. Dieser Index wird möglicherweise später stillschweigend gelöscht, wenn Sie einen anderen Index erstellen, mit dem die Fremdschlüsseleinschränkung erzwungen werden kann. Der angegebene Indexname wird, falls angegeben, wie zuvor beschrieben verwendet.
Jonathan M
1
Das ist der Grund, warum ich hierher gekommen bin: Ich habe versucht, einen Fremdschlüssel ON DELETE SET NULLfür eine Spalte zu erstellen, die ich sein wollte NOT NULL. Angenommen, Sie können Ihren Kuchen nicht haben und ihn auch nicht essen.
Martin Hennings
8

Ü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.

Carlos Laspina
quelle
Dies war das Problem in meinem Fall - der MySQL-Fehler ist überhaupt nicht hilfreich!
Juddling
7

In meinem Fall hatte ich eine Tabelle mit SET FOREIGN_KEY_CHECKS=0und danach gelöscht SET FOREIGN_KEY_CHECKS=1. Als ich den Tisch nachladen wollte, bekam ich error 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 wurde error 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.

CodeMed
quelle
5

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.

user2975399
quelle
4

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.

Alex
quelle
3

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 ist Hilfe;)

Yacine Richthofen
quelle
1
Sie haben ein paar Kommas in Ihrem ersten CREATE
DLight
3

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

user3478348
quelle
3

Ich wollte diesen Fall nur auch für die VARCHARFremdschlü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 VARCHARund 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 vor

SHOW ENGINE INNODB STATUS;

Bei Verwendung dieses Befehls erhielt ich die folgende ausführliche Beschreibung des Fehlers ohne zusätzliche hilfreiche Informationen

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

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

Dies ergab die folgende Fehlermeldung:

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

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:

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

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 utf8mb4Zeichensatz und utf8mb4_0900_ai_ciSortierung. 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:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

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

Randnotiz: Die Sortierung utf8mb4_general_cifunktioniert in MySQL Workbench 5.0 oder höher. Die Sortierung utf8mb4_0900_ai_cifunktioniert 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.

CoderBapu
quelle
2

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
)
Gathila
quelle
2

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.

Mozaffar
quelle
2

Für MySQL (INNODB) ... Definitionen für Spalten abrufen, 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 wie 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;
Bortunac
quelle
2

Überprüfen Sie die Tabellenkompatibilität. Wenn beispielsweise eine Tabelle MyISAMund die andere Tabelle vorhanden ist InnoDB, liegt möglicherweise dieses Problem vor.

Dennis
quelle
2

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).

Robsch
quelle
1

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.

nmgeek
quelle
1

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.

Chris Neve
quelle
1

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

Tschad
quelle
1

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. :-)

Stephen Nortje
quelle
Was meinst du damit?
Yazan Jaber
2
@YazanJaber Ich denke, er meint dies : InnoDB erlaubt einem Fremdschlüssel, auf eine Indexspalte oder eine Gruppe von Spalten zu verweisen. In der referenzierten Tabelle muss jedoch ein Index vorhanden sein, in dem die referenzierten Spalten als erste Spalten in derselben Reihenfolge aufgeführt sind.
Robsch
1

Wenn Sie versuchen, bei Verwendung der Laravel-Migration einen Fremdschlüssel zu erstellen

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


Wenn Sie den Primärschlüssel verwenden $table->Increments('id');

Sie sollten Integerals Fremdschlüssel verwenden

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

Wenn Sie den Primärschlüssel verwenden $table->tinyIncrements('id');

Sie sollten unsignedTinyIntegerals Fremdschlüssel verwenden

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

Wenn Sie den Primärschlüssel verwenden $table->smallIncrements('id');

Sie sollten unsignedSmallIntegerals Fremdschlüssel verwenden

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

Wenn Sie den Primärschlüssel verwenden $table->mediumIncrements('id');

Sie sollten unsignedMediumIntegerals Fremdschlüssel verwenden

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');
MAHDI ABDULSAHIB
quelle
Das hilft mir. Ich hatte bigIncrementsals Primärschlüssel, also musste ichunsignedBigInteger
jagad89
1

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

SET FOREIGN_KEY_CHECKS=0;

Arvind Bhardwaj
quelle
0

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

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

aber die Rückzitate 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 ...

Olivier Faucheux
quelle
0

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.

Dima Dz
quelle
0

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.

Noowie
quelle
0

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.

Ajon
quelle
0

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 und SET FOREIGN_KEY_CHECKS = 1;unten in die Speicherauszugsdatei eingefügt werden sollen .

Diese Lösung hat bei mir funktioniert.

Arya
quelle
0

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 .

DukesNuz
quelle
-1

Sogar ich hatte das gleiche Problem. Und der Fehler war mit dem "vorzeichenlosen" Marker in der Tabelle PK der FK

blueFroggy
quelle
-6

Ich hatte einmal den gleichen Fehler. Ich habe einfach den MySQL-Server neu gestartet und das Problem behoben.

b5bus
quelle
Dies behebt das Problem überhaupt nicht.
James111