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

Ich habe ein seltsames Problem. Ich versuche, einer Tabelle, die auf eine andere verweist, einen Fremdschlüssel hinzuzufügen, der jedoch aus irgendeinem Grund fehlschlägt. Mit meinen begrenzten Kenntnissen von MySQL ist die einzige Sache, die möglicherweise verdächtig sein könnte, dass es einen fremden Schlüssel auf einer anderen Tabelle gibt, die auf die verweist, auf die ich zu verweisen versuche.

Hier ist ein Bild meiner Tabellenbeziehungen, erstellt über phpMyAdmin: Beziehungen

Ich habe eine SHOW CREATE TABLE Abfrage für beide Tabellen durchgeführt, sourcecodes_tags ist die Tabelle mit dem Fremdschlüssel, sourcecodes ist die referenzierte Tabelle.

 CREATE TABLE `sourcecodes` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(11) unsigned NOT NULL, `language_id` int(11) unsigned NOT NULL, `category_id` int(11) unsigned NOT NULL, `title` varchar(40) CHARACTER SET utf8 NOT NULL, `description` text CHARACTER SET utf8 NOT NULL, `views` int(11) unsigned NOT NULL, `downloads` int(11) unsigned NOT NULL, `time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `language_id` (`language_id`), KEY `category_id` (`category_id`), CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 CREATE TABLE `sourcecodes_tags` ( `sourcecode_id` int(11) unsigned NOT NULL, `tag_id` int(11) unsigned NOT NULL, KEY `sourcecode_id` (`sourcecode_id`), KEY `tag_id` (`tag_id`), CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 

Es wäre toll, wenn mir jemand sagen könnte, was hier los ist, ich habe keine formelle Ausbildung oder irgendetwas mit MySQL 🙂

Vielen Dank.

Edit: Dies ist der Code, der den Fehler erzeugt:

 ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE 

Solutions Collecting From Web of "Mysql error 1452 – Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl"

Sehr wahrscheinlich enthält Ihre Tabelle ” sourcecode_id Werte, die in Ihrer sourcecodes nicht mehr vorhanden sind. Sie müssen diese zuerst loswerden.

Hier ist eine Abfrage, die diese IDs finden kann:

 SELECT DISTINCT sourcecode_id FROM sourcecodes_tags tags LEFT JOIN sourcecodes sc ON tags.sourcecode_id=sc.id WHERE sc.id IS NULL; 

Ich hatte das gleiche Problem mit meiner MySQL-database, aber schließlich bekam ich eine Lösung, die für mich funktionierte.
Da in meiner Tabelle alles aus Sicht von mysql in Ordnung war (beide Tabellen sollten die Innodb-Engine verwenden und der Datentyp jeder Spalte sollte vom selben Typ sein, der an der Fremdschlüssel-Einschränkung beteiligt ist).
Ich habe nur die Fremdschlüsselprüfung deaktiviert und später aktiviert, nachdem ich eine Fremdschlüsseloperation ausgeführt hatte.
Schritte, die ich gemacht habe:

 mysql> SET foreign_key_checks = 0; mysql> alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query OK, 8 rows affected (0.23 sec) Records: 8 Duplicates: 0 Warnings: 0 mysql> SET foreign_key_checks = 1; 

Verwenden Sie NOT IN , um zu ermitteln, wo Constraints eingeschränkt werden :

 SELECT column FROM table WHERE column NOT IN (SELECT intended_foreign_key FROM another_table) 

also, genauer gesagt:

 SELECT sourcecode_id FROM sourcecodes_tags WHERE sourcecode_id NOT IN (SELECT id FROM sourcecodes) 

EDIT: IN und NOT IN Operatoren sind bekanntermaßen viel schneller als die JOIN Operatoren, sowie viel einfacher zu konstruieren und zu wiederholen.

Kürzen Sie die Tabellen und fügen Sie dann die FK-Beschränkung hinzu .

Ich weiß, dass diese Lösung ein wenig peinlich ist, aber es funktioniert 100%. Aber ich stimme zu, dass dies keine ideale Lösung für das Problem ist, aber ich hoffe, es hilft.

Dies geschieht auch beim Festlegen eines Fremdschlüssels für parent.id in der Spalte child.column, wenn die Spalte child.column bereits den Wert 0 hat und der Wert parent.id 0 ist

Sie müssen sicherstellen, dass jede child.column NULL ist oder einen Wert hat, der in parent.id vorhanden ist

Und jetzt, wo ich die Aussage gelesen habe, die nos geschrieben hat, bestätigt er das.

Für mich war dieses Problem ein wenig anders und super einfach zu überprüfen und zu lösen.

Sie müssen sicherstellen, dass beide Tabellen InnoDB sind. Wenn eine der Tabellen, nämlich die Referenztabelle ein MyISAM ist, wird die Einschränkung fehlschlagen.

 SHOW TABLE STATUS WHERE Name = 't1'; ALTER TABLE t1 ENGINE=InnoDB; 

Ich hatte heute das gleiche Problem. Ich testete für vier Dinge, von denen einige bereits erwähnt wurden:

  1. Gibt es Werte in Ihrer untergeordneten Spalte, die nicht in der übergeordneten Spalte vorhanden sind (außer NULL, wenn die untergeordnete Spalte nullfähig ist)?

  2. Haben die Child- und Parent-Spalten den gleichen Datentyp?

  3. Gibt es einen Index für die übergeordnete Spalte, auf die Sie verweisen? MySQL scheint dies aus Performance-Gründen zu erfordern ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html )

  4. Und dieses hat es für mich getriggers: Haben beide Tabellen identische Sortierung?

Ich hatte einen Tisch in utf-8 und den anderen in Iso-etwas. Das hat nicht funktioniert. Nach dem Ändern der Iso-Tabelle in die UTF-8-Kollatierung konnten die Einschränkungen ohne Probleme hinzugefügt werden. In meinem Fall zeigte phpMyAdmin nicht einmal die Child-Tabelle in ISO-Kodierung in der Dropdown-Liste zum Erstellen der Fremdschlüsseleinschränkung.

Es scheint, dass es einen ungültigen Wert für die Spalte wie 0 gibt, der kein gültiger Fremdschlüssel ist, daher kann MySQL keine Fremdschlüsseleinschränkung dafür setzen.

Sie können diese Schritte ausführen:

  1. Löschen Sie die Spalte, für die Sie versucht haben, die FK-Einschränkung festzulegen.

  2. Fügen Sie es erneut hinzu und legen Sie seinen Standardwert als NULL fest.

  3. Versuchen Sie erneut, die Fremdschlüsseleinschränkung dafür festzulegen.

Ich hatte das gleiche Problem, ich überprüfte die Zeilen meiner Tabellen und fand heraus, dass einige Inkompatibilitäten mit dem Wert der Felder, die ich als Fremdschlüssel definieren wollte, vorlagen. Ich korrigierte diesen Wert, versuchte es erneut und das Problem wurde getriggers.

Am Ende lösche ich alle Daten in meiner Tabelle und führe die Änderung erneut aus. Es klappt. Nicht die brillante, aber es spart viel Zeit, vor allem Ihre Anwendung befindet sich noch in der Entwicklungsphase ohne Kundendaten.

Versuche dies

 SET foreign_key_checks = 0; ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE SET foreign_key_checks = 1; 

Ich hatte genau dasselbe Problem zu drei verschiedenen Zeiten. In jedem Fall lag es daran, dass einer (oder mehrere) meiner Datensätze nicht dem neuen Fremdschlüssel entsprach. Möglicherweise möchten Sie Ihre vorhandenen Datensätze aktualisieren, um den Syntaxeinschränkungen des Fremdschlüssels zu folgen, bevor Sie versuchen, den Schlüssel selbst hinzuzufügen. Das folgende Beispiel sollte die Problemdatensätze im Allgemeinen isolieren:

 SELECT * FROM (tablename) WHERE (candidate key) <> (proposed foreign key value) AND (candidate key) <> (next proposed foreign key value) 

Wiederholen Sie AND (candidate key) <> (next proposed foreign key value) innerhalb Ihrer Abfrage für jeden Wert im Fremdschlüssel.

Wenn Sie eine Menge Platten haben, kann das schwierig sein, aber wenn Ihr Tisch ziemlich klein ist, sollte es nicht zu lange dauern. Ich bin nicht super erstaunlich in SQL-Syntax, aber das hat immer das Problem für mich isoliert.

Leeren Sie die Daten Ihrer Tabellen und führen Sie den Befehl aus. Es wird klappen.

Ich habe diesen Fehler bei der Verwendung von Laravel und eloquent bekommen, indem ich versucht habe, eine Fremdschlüsselverbindung zu einem 1452 zu machen. Das Problem war ein Mangel an Daten in der verknüpften Tabelle.

Hier finden Sie ein Beispiel: http://mstd.eu/index.php/2016/12/02/laravel-leoquent-integrity-constraint-violation-1452-foreign-key-constraint/

Ich habe eine Lösung, Sie müssen nur eine Frage beantworten:

Speichert Ihre Tabelle bereits Daten? Vor allem die Tabelle enthielt einen Fremdschlüssel.

Wenn die Antwort ja lautet, löschen Sie nur den gesamten Datensatz, und Sie können einen beliebigen Fremdschlüssel in Ihrer Tabelle hinzufügen.

statement löschen: Von Kind (mit Fremdschlüsseltabelle) zu Elterntabelle.

Der Grund, warum Sie einen Fremdschlüssel nach Dateneinträgen nicht hinzufügen können, liegt an der Tabelleninkonsistenz. Was werden Sie mit einem neuen Fremdschlüssel in einer früheren Tabelle mit gefüllten Daten tun?

Wenn nein, folgen Sie den statementen anderer.

Ich habe diese Lösungen vorbereitet und dieses Beispiel könnte helfen.

Meine database enthält zwei Tabellen (E-Mail und Kreditkarte) mit Primärschlüsseln für ihre IDs. Eine andere Tabelle (Client) bezieht sich auf diese Tabellen-IDs als Fremdschlüssel. Ich habe einen Grund, die E-Mail neben den Kundendaten zu haben.

Zuerst füge ich die Zeilendaten für die referenzierten Tabellen ein (email, credit_card), dann erhält man die ID für jede, diese IDs werden in der dritten Tabelle (Client) benötigt.

Wenn Sie nicht zuerst die Zeilen in den referenzierten Tabellen einfügen, kann MySQL die Korrespondenzen nicht erstellen, wenn Sie eine neue Zeile in die dritte Tabelle einfügen, die auf die Fremdschlüssel verweist.

Wenn Sie zuerst die referenzierten Zeilen für die referenzierten Tabellen und dann die Zeile für fremde Schlüssel einfügen, tritt kein Fehler auf.

Hoffe das hilft.

Stellen Sie sicher, dass der Wert in der anderen Tabelle ist, sonst erhalten Sie diesen Fehler in der zugewiesenen entsprechenden Spalte.

Wenn also die zugewiesene Spalte einer Zeilen-ID einer anderen Tabelle zugewiesen wird, vergewissern Sie sich, dass eine Zeile in der Tabelle vorhanden ist. Andernfalls wird dieser Fehler angezeigt.

 UPDATE sourcecodes_tags SET sourcecode_id = NULL WHERE sourcecode_id NOT IN ( SELECT id FROM sourcecodes); 

sollte helfen, diese IDs loszuwerden. Oder wenn null in sourcecode_id nicht erlaubt ist, dann entferne diese Zeilen oder füge diese fehlenden Werte zur sourcecodes .

Ich hatte das gleiche Problem und fand die Lösung, indem ich NULL anstelle von NOT NULL auf die Fremdschlüsselspalte setzte. Hier ist eine Abfrage:

 ALTER TABLE `db`.`table1` ADD COLUMN `col_table2_fk` INT UNSIGNED NULL, ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC), ADD CONSTRAINT `col_table2_fk1` FOREIGN KEY (`col_table2_fk`) REFERENCES `db`.`table2` (`table2_id`) ON DELETE NO ACTION ON UPDATE NO ACTION; 

MySQL hat diese Abfrage ausgeführt!