Comment supprimer un sku en double via une base de données?


12

J'obtiens cette erreur lorsque j'essaie de modifier et d'enregistrer quelques-uns de mes produits Magento via admin: " La valeur de l'attribut" SKU "doit être unique ."

Lorsque je consulte mes produits dans l'administration Magento, un sku en double est introuvable, mais lorsque je lance une exportation de produit, il y a en fait certains produits avec le même sku. En théorie, Magento n'aurait jamais dû permettre que cela se produise, mais hélas, j'ai affaire à un groupe de produits assez important et mature (âgé de 3 ans et plus) qui semble porter les restes des précédents bugs et bizarreries de Magento.

Je suppose que la seule façon de résoudre ce problème est de supprimer manuellement l'un des skus en double de la base de données, mais je ne suis pas sûr de la meilleure façon / la plus sûre de le faire. J'ai à peu près 0 expérience de travail avec des bases de données, donc toute aide est appréciée.

Réponses:


7
  1. Sauvegardez votre catalog_product_entitytable de base de données ( voir: /programming//a/6683000/4457531 )

  2. Vérifiez si des skus en double sont présents dans le catalog_product_entitytableau avec cette requête:

    SELECT COUNT(*), sku
    FROM `catalog_product_entity`
    GROUP BY sku HAVING COUNT(*) > 1
  3. Supprimer les entrées en double

    • Supprimez les nouveaux produits en double et conservez l'ancienne référence avec:

      DELETE catalog_product_entity FROM catalog_product_entity
      LEFT OUTER JOIN (
          SELECT MIN(entity_id) as id, sku
          FROM catalog_product_entity
          GROUP BY sku
      ) as t1
      ON catalog_product_entity.entity_id = t1.id
      WHERE t1.id IS NULL
    • Pour supprimer les anciens produits en double et conserver la nouvelle référence, remplacez-la MINparMAX dans la sous-requête join

      LEFT OUTER JOIN (
          SELECT MAX(entity_id) as id, sku
          ...
      )


1

Vous devrez enquêter et nettoyer ces skus inattendus. Trouvez d'abord les skus concernés, puis vous devrez les nettoyer dans la base de données avec la requête ci-dessous:

DELETE FROM `catalog_product_entity` WHERE `sku` IN ('SKU1', 'SKU2', ..., 'SKU1654');

notez que je vous recommande de le faire si vous êtes sûr de ce que vous faites, cela ne sera pas réversible.


N'oubliez pas de sauvegarder votre base de données avant d'appliquer directement toute requête sensible
Nolwennig

1

Veuillez exécuter le script ci-dessous via la base de données

DELETE FROM `catalog_product_entity` WHERE `entity_id` IN (SELECT *  FROM (SELECT `entity_id` FROM `catalog_product_entity` GROUP BY `sku` HAVING (COUNT(*) > 1)) AS A);

N'oubliez pas de sauvegarder votre base de données avant d'appliquer directement toute requête sensible
Nolwennig
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.