PHP & MySQL Engineering

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 Datei
  • SET 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;

Icon Wink in Cannot delete or update a parent row: a foreign key constraint fails

 

Kommentare: 3

Kommentar hinterlassen »

 
 
 

Danke, genau danach hatte ich gesucht ;)

 
 

Super, dankeschön.
Hat mir weitergeholfen :)

 
 

Danke ;) Freut mich zu hören.

 
 

Kommentar hinterlassen

 
(Wird nicht veröffentlicht)
 
(rel="follow")
 
Kommentar *
 
Fünf + Neun =