Foreign Keys reparieren

Artikelversion

5.5.0 oder neuer

Inhaltsverzeichnis

In bestimmten Konstellationen und auch nur bei manchen Hostern, kann es vorkommen, dass die Foreign-Keys, die Shopware in der Datenbank benötigt, verloren gehen. Die Modelgenerierung der Attributmodels benötigt diese Keys, damit die Attribute korrekt erstellt werden können.

Dies kann zu Fehlermeldungen führen, ähnlich wie Diese:


[Semantical Error] line 0, col 114 near 'billing WHERE': Error: Class Shopware\Models\Attribute\CustomerBilling has no association named customerBilling in Doctrine/ORM/Query/QueryException.php on line 47
Stack trace: ...


Gehe hier bitte wie folgt vor.

1. Erstelle ein Backup der Datenbank.

2. Lade die Datei unter "Verfügbare Downloads" auf dieser Seite herunter.

3. Entpacke die heruntergeladene Datei auf Deinem lokalem System

4. Wähle im PHPMyAdmin Deine Shopware Datenbank aus. Auf der rechten Seite findest Du den Reiter "Import". Über diese Funktion kannst Du eine "zu importierende Datei" auswählen. Wähle die heruntergeladene Datei vom lokalen Rechner aus. Bestätige diesen Vorgang mit (Okay) auf der Seite.

5. Lösche nun via FTP den Cache, indem Du den Ordner "production_xxxx" (x = Datum des verwendeten Builds) im Ordner "var/cache" löschst.

6. Überprüfe die Dateirechte der Ordner. Diese brauchen vollen Lese- und Schreibzugriff

7. Rufe das Frontend im Browser erneut auf.

Fertig

Fehlerbehandlung

...CONSTRAINT FAILED... FOREIGN KEY (`basketID`)...

Falls beim Ausführen der SQL Datei eine ähnliche Fehlermeldung wie diese erhalten, befinden sich korrupte Daten in der Datenbank:

MySQL meldet:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`result 2 when explaining filename '#CONSTRAINT `*******cc_ibfk_1` FOREIGN KEY (`basketID`) REFERENCES `s_order_basket` (`id`) ON DELETE CASCADE ON UPDATE )

Diese kannst Du mit folgendem Statement entfernen. Führe das Statement in phpMyAdmin aus:


DELETE FROM s_order_basket_attributes  WHERE basketID NOT IN (
    SELECT id FROM s_order_basket
); 

Starte nun wieder bei Schritt 4 und führe die SQL Datei erneut aus.

...CONSTRAINT FAILED... FOREIGN KEY (`categoryID`)...

Falls beim Ausführen der SQL Datei eine ähnliche Fehlermeldung wie diese erhalten, befinden sich korrupte Daten in der Datenbank:

MySql meldet:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`****`.`#sql-ac5_2d164`, CONSTRAINT `#sql-ac5_2d164_ibfk_1` FOREIGN KEY (`categoryID`) REFERENCES `s_categories` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION) 

Diese kannst Du mit folgendem Statement entfernen. Führe das Statement in phpMyAdmin aus:


DELETE ca -- SELECT ca.*
FROM `s_categories_attributes` ca 
LEFT JOIN s_categories c
ON c.id = ca.categoryID 
WHERE c.id IS NULL

Wenn Du die Meldungen bei einer anderen Tabelle bekommst, musst Du das Query anpassen.

Beispiel:


 
DELETE ca -- SELECT ca.*
FROM `s_MY_TABLE_attributes` ca 
LEFT JOIN s_MY_TABLE c
ON c.id = ca.categoryID 
WHERE c.id IS NULL

...CONSTRAINED FAILED... FOREIGN KEY ('articleID')...

mySql meldet:
 
#1452 - Cannot add or update a child row:
a foreign key constraint fails
(`xxxxxx`.`xxxxxxxxxx`,
CONSTRAINT `#xxxxxxxxxxxx`
FOREIGN KEY (`articleID`)
REFERENCES `s_articles` (`id`)
ON DELETE CASCADE ON UPDATE NO ACTION)

Lösung:


DELETE ca -- SELECT ca.*
FROM `s_articles_attributes` ca 
LEFT JOIN s_articles c
ON c.id = ca.articleID 
WHERE c.id IS NULL   

Verfügbare Downloads

Download Foreign Keys bis 5.2.13
Download Download Foreign Keys ab 5.2.13