Shopware Datensatz Leichen finden und bereinigen

Wie ich in diesem Blog-Beitrag geschrieben habe, entstehen bei einem meiner Shopware-Projekte Datensatz-Inkonsistenzen im Bereich der Artikel und Artikel-Varianten.

Aus diesem Grund habe ich mir die Shopware Datenbank Struktur und deren Inhalte mal etwas genauer angesehen.
Durch lesen dieses Artikels aus den Shopware-Docs habe ich bereits befürchtet, dass da wahrscheinlich nicht 100%ig alles sauber sein wird.
Ich musste feststellen, dass es durchaus auch noch andere „Baustellen“ an der Datenbank und deren Inhalte gibt.
Zum Beispiel wären das die Tabellen s_article_configurator_sets, s_article_configurator_set_group_relations, s_article_configurator_set_option_relations und s_article_configurator_option_relations

In diesen Tabellen wird die Zuordnung von Artikeln zu Varianten-Gruppen (Größe, Farbe, etc.) und Varianten-Options (XL, XXL, grün, gelb etc.) hinterlegt.

Nun ist es in unserer aktuellen Shopware-Version (5.5.7) leider immer noch so, dass wenn ein Artikel über die API oder das Backend gelöscht wird, die entsprechenden Datenbankeinträge in diesen Tabellen nicht mit gelöscht werden.
Daher entstehen – je nach dem wie oft Artikel gelöscht werden – eine Menge Datensatz-Leichen, die nicht mehr benötigt werden.

Hier mal die SQL-Abfragen zum Aufspüren der Leichen rund um die Artikel im Shopware:

unbenutzte Daten s_article_configurator_sets

SELECT cs.* 
FROM s_article_configurator_sets cs
LEFT JOIN s_articles a
ON a.configurator_set_id = cs.id
WHERE a.id IS NULL

unbenutzte Daten s_article_configurator_set_group_relations

SELECT csgr.*
FROM s_article_configurator_set_group_relations csgr
LEFT JOIN s_article_configurator_sets cs
ON cs.id = csgr.set_id
LEFT JOIN s_articles a
ON a.configurator_set_id = cs.id
WHERE a.id IS NULL OR cs.id IS NULL

unbenutzte s_article_configurator_set_option_relations

SELECT csor.*
FROM s_article_configurator_set_option_relations csor
LEFT JOIN s_article_configurator_sets cs
ON cs.id = csor.set_id 
LEFT JOIN s_articles a
ON a.configurator_set_id = cs.id
WHERE a.id IS NULL OR cs.id IS NULL

unbenutzte s_article_configurator_option_relations

Beziehung von Variante zu Option. In diesen Fällen ist der Eintrag in der s_article_configurator_option_relations eine Leiche, d.h. die Variante existiert gar nicht mehr in der s_articles_details

SELECT r.*
FROM s_article_configurator_option_relations r
LEFT JOIN s_articles_details a
ON a.id = r.article_id
WHERE a.id IS NULL 

„kaputte Varianten“ ermitteln. In diesen Fällen fehlt der Eintrag in der Tabelle s_article_configurator_option_relations, dass die jeweilige Variante die Option besitzt.

SELECT d.*
FROM s_articles_details d
JOIN s_articles a ON d.articleID = a.id AND a.configurator_set_id IS NOT NULL
LEFT JOIN s_article_configurator_option_relations cr ON cr.article_id = d.id
WHERE cr.id IS NULL;

Einträge in der s_articles ohne Eintrag in der s_articles_details

SELECT *
FROM s_articles a 
LEFT JOIN s_articles_details d
ON d.articleID = a.id
WHERE d.id IS NULL 

Ich habe hier bewusst, nicht die DELETE Statements hingeschrieben, sondern nur die SELECT’s. Falls ihr hier Ergebnisse bekommt habt ihr definitiv Daten-Leichen bzw. inkonsistenzen in Eurer Shopware-Datenbank.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.