Как удалить дубликат sku через базу данных?


12

Я получаю эту ошибку при попытке изменить и сохранить несколько моих продуктов Magento через администратора: « Значение атрибута« SKU »должно быть уникальным ».

Когда я просматриваю свои продукты в Magento admin, дубликаты sku не обнаруживаются, но когда я запускаю экспорт продуктов, на самом деле есть продукты с таким же sku. Теоретически, Magento никогда не должен был допускать этого, но, увы, я имею дело с довольно большой и зрелой (более 3-х лет) группой продуктов, которые, похоже, содержат остатки предыдущих ошибок и причуд Magento.

Я предполагаю, что единственный способ решить эту проблему - вручную удалить один из дубликатов skus из базы данных, но я не уверен, что это лучший / самый безопасный способ сделать это. У меня почти 0 опыта работы с базами данных, поэтому любая помощь приветствуется.

Ответы:


7
  1. Сделайте резервную catalog_product_entityкопию таблицы базы данных ( см .: /programming//a/6683000/4457531 ).

  2. Проверьте, есть ли дубликаты skus в catalog_product_entityтаблице с этим запросом:

    SELECT COUNT(*), sku
    FROM `catalog_product_entity`
    GROUP BY sku HAVING COUNT(*) > 1
  3. Удалить дубликаты записей

    • Удалите новые дубликаты продуктов и сохраните старые пометки с помощью:

      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
    • Чтобы удалить старые дубликаты продуктов и сохранить новые sku, замените MINихMAX в подзапросе join

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

3

Возможно, у вас нет дублирующих SKU в вашей базе данных, они появляются только в magento 1.9.2.x при запуске экспорта.

Попробуй это:

https://github.com/baconl/Magento-1.9.2.1-duplicate-sku-fix

Это временное исправление, пока основная команда magento не исправит это,


1

Вам нужно будет исследовать и почистить эти неожиданные скусы. Сначала найдите соответствующий skus, затем вам нужно будет очистить его в базе данных с помощью запроса ниже:

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

Обратите внимание, что я рекомендую вам сделать это, если вы уверены, что делаете, это не будет обратимым.


Имейте в виду, чтобы сделать резервную копию вашей базы данных, прежде чем применять любой разумный запрос напрямую
Nolwennig

1

Пожалуйста, запустите приведенный ниже скрипт через базу данных

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

Имейте в виду, чтобы сделать резервную копию вашей базы данных, прежде чем применять любой разумный запрос напрямую
Nolwennig
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.