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 ORDRELINJE
Tabelle 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
, CONSTRAINTOrdrelinje_fk
FOREIGN KEY (Ordre
) REFERENCESOrdre
(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?
mysql
sql
mariadb
mysql-error-1452
user3289677
quelle
quelle
Antworten:
Entnommen aus der Verwendung von FOREIGN KEY Constraints
Ihr Fehler
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails
bedeutet also im Wesentlichen, dass Sie versuchen, IhrerOrdrelinje
Tabelle eine Zeile hinzuzufügen, für die keine übereinstimmende Zeile (OrderID) in derOrdre
Tabelle vorhanden ist.Sie müssen zuerst die Zeile in Ihre
Ordre
Tabelle einfügen .quelle
Sie erhalten diese Einschränkungsprüfung, da in der
Ordre
Tabelle keine ReferenzOrdreID
im Befehl insert angegeben ist.Um einen Wert einzufügen
Ordrelinje
, müssen Sie zuerst einen Wert in dieOrdre
Tabelle eingeben und diesenOrdreID
in derOrderlinje
Tabelle verwenden.Oder Sie können die Nicht-Null-Einschränkung entfernen und einen NULL-Wert einfügen.
quelle
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
quelle
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)
2) Global
quelle
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 Join
alle 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:Jetzt können Sie im Allgemeinen einen (oder mehrere) der folgenden Schritte ausführen, um die Daten zu reparieren.
null
.Sobald die Daten festgelegt sind, können wir die Fremdschlüsseleinschränkung mithilfe der
ALTER TABLE
Syntax anwenden .quelle
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
quelle
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!
quelle
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.
quelle
Ihr
ORDRELINJE
Tisch ist verknüpft mitORDER
Tabelle einen Fremdschlüssel mit ,constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)
nach derOrdre int NOT NULL,
Spalte der TabelleORDRELINJE
muss alle übereinstimmenOrdre int NOT NULL,
Spalte vonORDER
Tabelle.Wenn Sie jetzt eine neue Zeile in eine
ORDRELINJE
Tabelle einfügen, wird gemäß der fk-EinschränkungOrdrelinje_fk
dieORDER
Tabelle überprüft , ob dieOrdreID
vorhanden 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.
quelle
Ü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.
quelle
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
quelle
Dies half mir nach dem Lesen von @ Mr-Faizans und anderen Antworten.
in phpMyAdmin und klicken Sie auf die Abfrage. Ich weiß nichts über WorkBench, aber die anderen Antworten könnten Ihnen helfen.
quelle
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
quelle
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.
quelle
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)
, wouserid
ist Fremdschlüssel in table2 von table1 .quelle
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.
quelle
Ü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.
quelle
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)
quelle