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.

Ein Kommentar zu „Shopware Datensatz Leichen finden und bereinigen

  1. Danke, das hat mich in die richtige Richtung geschubst.

    Bei mir hat es noch einen Schritt mehr gebraucht um den Fehler zu beheben. Ich musste nicht nur die ‚xxx_relations‘ Tabellen bereinigen, sondern auch die ‚_groups‘ und ‚_options‘ Tabelle. Dort stehen die eigentlichen Werte drin, die durch die beiden „relations“ verknüpft werden.

    Queries dazu:

    ## s_article_configurator_options

    SELECT co.*
    FROM s_article_configurator_options co
    LEFT JOIN s_article_configurator_set_option_relations csor
    ON co.id = csor.option_id
    WHERE csor.set_id IS NULL

    ## s_article_configurator_groups

    SELECT cg.*
    FROM s_article_configurator_groups cg
    LEFT JOIN s_article_configurator_set_group_relations csgr
    ON cg.id = csgr.group_id
    WHERE csgr.set_id IS NULL

    Grüße!

Schreibe einen Kommentar

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