Jak usunąć zduplikowane SKU poprzez bazę danych?


12

Występuje ten błąd podczas próby edycji i zapisania kilku moich produktów Magento przez administratora: „ Wartość atrybutu„ SKU ”musi być unikalna .”

Kiedy przeglądam moje produkty w Magento admin, nigdzie nie można znaleźć duplikatu SKU, ale kiedy uruchamiam eksport produktu, w rzeczywistości są niektóre produkty z tym samym SKU. Teoretycznie Magento nigdy nie powinien na to pozwolić, ale niestety mam do czynienia z dość dużą i dojrzałą (ponad 3 lata) grupą produktów, która wydaje się zawierać resztki poprzednich błędów i dziwactw Magento.

Domyślam się, że jedynym sposobem na rozwiązanie tego problemu jest ręczne usunięcie jednego ze zduplikowanych skusów z bazy danych, ale nie jestem pewien, czy jest to najlepszy / najbezpieczniejszy sposób. Mam prawie 0 doświadczeń w pracy z bazami danych, więc każda pomoc jest mile widziana.

Odpowiedzi:


7
  1. Backup Twój catalog_product_entitytabeli bazy danych ( patrz: /programming//a/6683000/4457531 )

  2. Sprawdź, czy w catalog_product_entitytabeli znajdują się zduplikowane skus :

    SELECT COUNT(*), sku
    FROM `catalog_product_entity`
    GROUP BY sku HAVING COUNT(*) > 1
    
  3. Usuń zduplikowane wpisy

    • Usuń nowe zduplikowane produkty i zachowaj starsze SKU dzięki:

      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
      
    • Aby usunąć stare zduplikowane produkty i zachować nowe SKU, zamień MINnaMAX w podzapytaniu Join

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


1

Musisz zbadać i oczyścić te nieoczekiwane skus. Najpierw znajdź odpowiedni skus, a następnie musisz wyczyścić go w bazie danych za pomocą poniższego zapytania:

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

Pamiętaj, że polecam to zrobić, jeśli masz pewność co do tego, co zrobisz, nie będzie to odwracalne.


Pamiętaj, aby wykonać kopię zapasową
bazy

1

Uruchom poniżej skrypt za pośrednictwem bazy danych

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);

Pamiętaj, aby wykonać kopię zapasową
bazy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.