Cannot delete or update a parent row: a foreign key constraint fails
Beim Importieren von InnoDB-Datenbanken kann es unter Umständen zu folgendem Fehler kommen:
ERROR 1217 (23000) at line 243: Cannot delete or update a parent row: a foreign key constraint fails |
Wie kommt es zu diesem Fehler?
Wenn man eine Datenbank mit mysqldump exportiert, wird eine Datei mit SQL - Befehlen erzeugt. Wenn man diese Datei anschliessend importiert, werden diese Befehle nacheinander ausgeführt und erzeugen eine Datenbank, die identisch zu der exportierten Version ist.
Bei InnoDB-Tabellen mit Fremdschlüssel-Beschränkungen wird es aber mit Sicherheit zu dem oben gennanten Fehler kommen. Dies liegt daran, dass die SQL-Befehle ohne logischen Zusammenhang ausgeführt werden.
Das MySQL Handbuch schreibt:
InnoDB weist jede INSERT- oder UPDATE-Operation zurück, die versucht, einen Fremdschlüsselwert in einer Kindtabelle anzulegen, wenn kein passender Schlüsselwert in der Elterntabelle vorhanden ist.
Da die SQL-Befehle, wie gesagt, ohne logischen Zusammenhang (der Reihe nach) abgearbeitet werden, kann es gut sein, dass die Kindtabelle vor der entsprechenden Elterntabelle importiert wird.
Wie umgeht man dieses Problem?
Lösung 1:
Man editiert die Backup-Datei und fügt folgende Befehle hinzu:
SET FOREIGN_KEY_CHECKS=0;=> An den Anfang der DateiSET FOREIGN_KEY_CHECKS=1;=> Ans Ende der Datei
echo "SET FOREIGN_KEY_CHECKS=0;" > backup_no_fkc.sql cat backup.sql >> backup_no_fkc.sql echo "SET FOREIGN_KEY_CHECKS=1;" >> backup_no_fkc.sql |
Nach dieser Änderung kann die Datei wie gewohnt importiert werden.
In PHPMyAdmin ist es übrigens möglich beim Exportieren die Option Disable foreign key checks anzukreuzen, dann werden diese beiden Befehle automatisch zur Backup-Datei hinzugefügt.
Lösung 2:
Man arbeitet mit der Konsole und importiert die Datei wie folgt:
mysql> SET FOREIGN_KEY_CHECKS = 0; mysql> SOURCE backup.sql mysql> SET FOREIGN_KEY_CHECKS = 1; |
Danke, genau danach hatte ich gesucht
Super, dankeschön.
Hat mir weitergeholfen
Danke
Freut mich zu hören.