Foreign Keys

Hi, ich habe eine Frage zu den Foreign Keys. Weil phpmyadmin mit der Reparatur-SQL die max execution time übertrifft habe ich jetzt mit der Konsole die Reparatur-SQL in die Datenbank eingespielt. Der resultierende Fehler lautet wie folgt

ERROR 1452 (23000) at line 593: Cannot add or update a child row: a foreign key constraint fails (`XXXXXX`.`XXXXXX`, CONSTRAINT `xxxxxx` FOREIGN KEY (`detailID`) REFERENCES `s_order_details` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION)

Dazu kann ich aber keine Hilfe-SQL-Befehl in der Anleitung finden: http://community.shopware.com/Foreign-Keys-reparieren_detail_954.html

Ich bin für jede Hilfe dankbar. Ich wäre auch dankbar wenn mit jemand erklären könnte, warum ausgerechnet Shopware bei mir Foreign Keys Probleme macht. Das es sowas überhaupt gibt weiss ich erst seit Shopware. Ich kann es nicht hinnehmen, dass der Hoster oder eine Standarddatenbank der Fehlerverursacher sein soll. Das sind auch diejenigen, die mir am wenigsten helfen können weil sie nicht wissen welche Art von Foreign Keys da kaputt sind weil sie die Shopsoftware ja auch nicht erfunden haben.

Die Foreign-Keys kannst du dir schnell verhauen, indem du eine Tabelle kopierst und damit auch die Foreign Keys. Da muss man etwas aufpassen, dass die Fremdschlüssel korrekt bleiben. Gerne hauen auch Plugin-Installationen die Foreign-Keys durcheinander. Shopware selbst arbeitet noch relativ wenig mit Foreign-Keys, da gibt es zahlreiche andere Beispiele die das deutlich mehr machen. Die Foreign Keys sollen ja Datenmüll verhindern und erkenntlich machen, wie die Daten miteinander verknüpft sind. Ein Problem kann also auch entstehen, wenn es Einträge gibt deren verknüpfte Inhalte nicht mehr existieren.

Das SQL kannst du dir nach dem Beispiel zusammenstellen, unten im Wiki sind ja schon ein paar. Wenn es bei dir die s_order_details ist, musst du das Querry anpassen:

DELETE ca
FROM `s_order_details_attributes`oda 
LEFT JOIN s_order_details od
ON od.id = oda.detailsID 
WHERE od.id IS NULL

Ob die Spalte nun wirklich “detailsID” heißt in der s_order_details_attributes - oder wie die wirklich heißt - müsstest du nachsehen, hab gerade keine Datenbank zur Hand.

1 Like

Lösung: 

DELETE ca -- SELECT ca.*
FROM `s_order_details_attributes` ca
LEFT JOIN s_order_details c
ON c.id = ca.detailID
WHERE c.id IS NULL

 

1 Like