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


130

Ich habe Tabellen in MySQL Workbench wie folgt erstellt:

ORDRE-Tabelle:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

PRODUKT-Tabelle:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

und ORDRELINJE Tabelle:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

Wenn ich also versuche, Werte in eine ORDRELINJETabelle einzufügen, erhalte ich:

Fehlercode: 1452. Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl ( srdjank. Ordrelinje, CONSTRAINT Ordrelinje_fkFOREIGN KEY ( Ordre) REFERENCES Ordre( OrdreID))

Ich habe die anderen Beiträge zu diesem Thema gesehen, aber kein Glück. Beaufsichtige ich etwas oder eine Idee, was zu tun ist?


Antworten:


172

Entnommen aus der Verwendung von FOREIGN KEY Constraints

Fremdschlüsselbeziehungen umfassen eine übergeordnete Tabelle, die die zentralen Datenwerte enthält, und eine untergeordnete Tabelle mit identischen Werten, die auf die übergeordnete Tabelle verweisen. Die FOREIGN KEY-Klausel ist in der untergeordneten Tabelle angegeben.

Alle INSERT- oder UPDATE-Operationen, die versuchen, einen Fremdschlüsselwert in einer untergeordneten Tabelle zu erstellen, werden abgelehnt, wenn in der übergeordneten Tabelle kein übereinstimmender Kandidatenschlüsselwert vorhanden ist.

Ihr Fehler Error Code: 1452. Cannot add or update a child row: a foreign key constraint failsbedeutet also im Wesentlichen, dass Sie versuchen, Ihrer OrdrelinjeTabelle eine Zeile hinzuzufügen, für die keine übereinstimmende Zeile (OrderID) in der OrdreTabelle vorhanden ist.

Sie müssen zuerst die Zeile in Ihre OrdreTabelle einfügen .


Oder können wir den Fremdschlüssel löschen und nach dem Einfügen der Daten einen Fremdschlüssel hinzufügen?
Vamsi Pavan Mahesh

@VamsiPavanMahesh, NEIN, denn selbst wenn du das tust; Ihre erstellte Schlüsselerstellung schlägt mit der gleichen Art von Fehler fehl, da es zu einer Nichtübereinstimmung der Schlüsseldaten kommt.
Rahul

4
Einfach ausgedrückt, wenn für Kinder Eltern-IDs definiert sind, müssen diese Eltern existieren. Und ich dachte, meine Syntax sei falsch ... Es hat mir sehr geholfen. Vielen Dank!
wst

2
Was ist mit optionalen Beziehungen?
Hamed Hamedi

40

Sie erhalten diese Einschränkungsprüfung, da in der OrdreTabelle keine Referenz OrdreIDim Befehl insert angegeben ist.

Um einen Wert einzufügen Ordrelinje, müssen Sie zuerst einen Wert in die OrdreTabelle eingeben und diesen OrdreIDin der OrderlinjeTabelle verwenden.

Oder Sie können die Nicht-Null-Einschränkung entfernen und einen NULL-Wert einfügen.


29

Sie müssen Daten in der untergeordneten Tabelle löschen, die keinen entsprechenden Fremdschlüsselwert für den Primärschlüssel der übergeordneten Tabelle haben. Oder löschen Sie alle Daten aus der untergeordneten Tabelle und fügen Sie neue Daten mit demselben Fremdschlüsselwert wie der Primärschlüssel in die übergeordnete Tabelle ein . Das sollte funktionieren . Hier auch ein Youtube Video


1
Dies ist richtig. Bevor Sie Daten in die Pivot-Tabelle einfügen (mit CASCADE-Einschränkungen), müssen Sie Daten in übergeordnete Tabellen einfügen. zB 1. Tabelle - Berechtigungen; 2. Tabelle - Rollen; 3. Tabelle - Berechtigungsrolle; Also 1. In Berechtigungstabelle einfügen, 2. In Rollentabelle einfügen und zuletzt in Berechtigungstabelle einfügen.
Deepak Panwar

23

Das Problem liegt in der FOREIGN KEY-Einschränkung. Standardmäßig (SET FOREIGN_KEY_CHECKS = 1). Die Option FOREIGN_KEY_CHECKS gibt an, ob Fremdschlüsseleinschränkungen für InnoDB-Tabellen überprüft werden sollen. MySQL - SET FOREIGN_KEY_CHECKS

Wir können die Fremdschlüsselprüfung als deaktivieren festlegen, bevor wir Query ausführen. Fremdschlüssel deaktivieren .

Führen Sie eine dieser Zeilen aus, bevor Sie Ihre Abfrage ausführen. Anschließend können Sie Ihre Abfrage erfolgreich ausführen. :) :)

1) Für Sitzung (empfohlen)

SET FOREIGN_KEY_CHECKS=0;

2) Global

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

Dieser Fehler tritt im Allgemeinen auf, weil das Referenzierungsfeld der untergeordneten Tabelle einige Werte enthält , die im Referenzierungs- / Kandidatenfeld der übergeordneten Tabelle nicht vorhanden sind.

Manchmal kann dieser Fehler auftreten, wenn wir Fremdschlüsseleinschränkungen auf vorhandene Tabellen anwenden, in denen bereits Daten enthalten sind . Einige der anderen Antworten schlagen vor, die Daten vollständig aus der untergeordneten Tabelle zu löschen und dann die Einschränkung anzuwenden. Dies ist jedoch keine Option, wenn die untergeordnete Tabelle bereits Arbeits- / Produktionsdaten enthält. In den meisten Szenarien müssen wir die Daten in der untergeordneten Tabelle aktualisieren (anstatt sie zu löschen).

Jetzt können wir Left Joinalle diese Zeilen in der untergeordneten Tabelle finden, die keine übereinstimmenden Werte in der übergeordneten Tabelle enthält. Die folgende Abfrage wäre hilfreich, um diese nicht übereinstimmenden Zeilen abzurufen:

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

Jetzt können Sie im Allgemeinen einen (oder mehrere) der folgenden Schritte ausführen, um die Daten zu reparieren.

  1. Basierend auf Ihrer "Geschäftslogik" müssen Sie diese nicht übereinstimmenden Werte mit den vorhandenen Werten in der übergeordneten Tabelle aktualisieren / abgleichen. Manchmal müssen Sie sie auch einstellen null.
  2. Löschen Sie diese Zeilen mit nicht übereinstimmenden Werten.
  3. Fügen Sie Ihrer übergeordneten Tabelle neue Zeilen hinzu, die den nicht übereinstimmenden Werten in der untergeordneten Tabelle entsprechen.

Sobald die Daten festgelegt sind, können wir die Fremdschlüsseleinschränkung mithilfe der ALTER TABLESyntax anwenden .


Ich lösche alle Daten aus der Tabelle und füge dann einen Fremdschlüssel hinzu, der hinzugefügt wurde. Danke
Sumit Kumar Gupta

4

in der Fremdschlüsseltabelle hat einen Wert, der nicht in der zugehörigen Primärschlüsseltabelle enthalten ist. Sie müssen also zuerst alle Daten löschen / den Wert Ihrer Fremdschlüsseltabelle entsprechend dem Wert in Ihrem Primärschlüssel anpassen


3

Ich habe dieses Problem erhalten, obwohl meine übergeordnete Tabelle alle Werte enthielt, auf die ich in meiner untergeordneten Tabelle verwiesen habe. Das Problem schien zu sein, dass ich einem einzelnen Fremdschlüssel nicht mehrere untergeordnete Verweise hinzufügen konnte. Mit anderen Worten, wenn ich fünf Datenzeilen hatte, die auf denselben Fremdschlüssel verweisen, erlaubte mir MySQL nur, die erste Zeile hochzuladen, und gab mir den Fehler 1452.

Was für mich funktioniert hat, war die Eingabe des Codes "SET GLOBAL FOREIGN_KEY_CHECKS = 0". Danach habe ich MySQL geschlossen und dann neu gestartet und konnte alle meine Daten ohne Fehler hochladen. Ich habe dann "SET GLOBAL FOREIGN_KEY_CHECKS = 1" eingegeben, um das System wieder auf Normal zu setzen, obwohl ich nicht ganz sicher bin, was FOREIGN_KEY_CHECKS tut. Hoffe das hilft!


Ist das nicht genau das, was bereits in der Antwort von @ Mr-Faizan vorgeschlagen wurde? Wenn nicht, erklären Sie bitte, was Ihre Antwort hinzufügt.
Adrian Mole

2

Dies kann behoben werden, indem zuerst die entsprechenden Datensätze in die übergeordnete Tabelle eingefügt werden und dann Datensätze in die entsprechende Spalte der untergeordneten Tabelle eingefügt werden. Überprüfen Sie auch den Datentyp und die Größe der Spalte. Es sollte mit der übergeordneten Tabellenspalte identisch sein, auch die Engine und die Sortierung sollten identisch sein. VERSUCHE DIES! So habe ich meine gelöst. Korrigieren Sie mich, wenn ich falsch liege.


1

Ihr ORDRELINJETisch ist verknüpft mit ORDERTabelle einen Fremdschlüssel mit , constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)nach der Ordre int NOT NULL,Spalte der Tabelle ORDRELINJEmuss alle übereinstimmen Ordre int NOT NULL,Spalte von ORDERTabelle.

Wenn Sie jetzt eine neue Zeile in eine ORDRELINJETabelle einfügen, wird gemäß der fk-Einschränkung Ordrelinje_fkdie ORDERTabelle überprüft , ob die OrdreIDvorhanden ist oder nicht, und da sie nicht mit einer OrderId übereinstimmt, beschwert sich der Compiler über eine Verletzung des Fremdschlüssels. Dies ist der Grund, warum Sie diesen Fehler erhalten.

Der Fremdschlüssel ist der Primärschlüssel der anderen Tabelle, die Sie in einer beliebigen Tabelle verwenden, um beide zu verknüpfen. Dieser Schlüssel ist an die Fremdschlüsseleinschränkung gebunden, die Sie beim Erstellen der Tabelle angeben. Jede Operation an den Daten darf diese Einschränkung nicht verletzen. Ein Verstoß gegen diese Einschränkung kann zu solchen Fehlern führen.

Hoffe ich habe es klar gemacht.


1

Überprüfen Sie beim Einfügen der Fremdschlüsselattributwerte zunächst den Attributtyp sowie den Primärschlüsselattributwert in der übergeordneten Beziehung. Wenn die Werte in der übergeordneten Beziehung übereinstimmen, können Sie untergeordnete Attributwerte problemlos einfügen / aktualisieren.


1

Sie sollten Daten von REFERENCES KEY in PRIMARY TABLE zu FOREIGN KEY in CHILD TABLE
hinzufügen. Dies bedeutet, dass Sie dem Fremdschlüssel keine zufälligen Daten hinzufügen. Verwenden Sie nur Daten von Primärschlüssel, auf die zugegriffen werden kann

Beschreibung der Daten im Fremdschlüssel


1

Dies half mir nach dem Lesen von @ Mr-Faizans und anderen Antworten.

Deaktivieren Sie die Option "Fremdschlüsselprüfungen aktivieren".

in phpMyAdmin und klicken Sie auf die Abfrage. Ich weiß nichts über WorkBench, aber die anderen Antworten könnten Ihnen helfen.


0

Sie sollten mindestens ein Raw in jede Tabelle einfügen (auf die die Fremdschlüssel zeigen sollen), dann können Sie die Werte der Fremdschlüssel einfügen oder aktualisieren


0

Ich drücke das hier rein: Mein Fall hat versucht, ein Like für einen Beitrag zu erstellen, der nicht existiert; Beim Festschreiben in die Datenbank wurde der Fehler ausgelöst. Die Lösung bestand darin, zuerst den Beitrag zu erstellen und ihn dann zu mögen. Nach meinem Verständnis musste die post_id, wenn sie in der Likes-Tabelle gespeichert werden sollte, zuerst mit der Posts-Tabelle überprüft werden, um die Existenz festzustellen. Ich fand es besser, es so zu haben, da es für mich logischer ist.


0

Wenn Sie einen Fremdschlüssel verwenden , sollte die Reihenfolge der Spalten beim Einfügen dieselbe sein .

Zum Beispiel, wenn Sie hinzufügen (userid, password)in table1 von table2 dann aus table2 Reihenfolge sollte gleich sein (userid, password)und nicht wie (password,userid) , wo useridist Fremdschlüssel in table2 von table1 .


0

Das Problem tritt auf, weil Sie den Fremdschlüssel in der untergeordneten Tabelle festlegen, nachdem Sie einige Daten in die untergeordnete Tabelle eingefügt haben.

Versuchen Sie, alle Daten aus der untergeordneten Tabelle zu entfernen, setzen Sie dann den Fremdschlüssel und fügen Sie anschließend die Daten in die Tabelle ein bzw. fügen Sie sie ein. Dies funktioniert.


0

Überprüfen Sie die Nr. Der Datensatz in der übergeordneten Tabelle, der mit der untergeordneten Tabelle und dem Primärschlüssel übereinstimmt, muss mit der Fremdschlüsselreferenz übereinstimmen. Das funktioniert bei mir.


-4

Es funktioniert zu 100% ...

FEHLER 1452: Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl .... Wenn dieser Fehlertyp auftritt: Gehen Sie zunächst zu dieser Tabelle und überprüfen Sie die Einstellung> Wenn Engine: InnoDB ist, ändern Sie sie in MyISAM

(und löschen Sie Verweise fremde Einschränkung)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.