Ошибка индексации в magento

Magento, Баги, глюки, ошибки, недочеты, Программирование

Метки (теги) : , , , ,

Автор: admin

При обновлении интернет магазина magento с версии 1.4.0 до 1.6.2 столкнулся с такой вот ошибкой, которая не давала сделать reindex

DEBUG (7): Exception message: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`xxx`.`catalog_category_product_index`, CONSTRAINT `
` FOREIGN KEY (`category_id`) REFERENCES `catalog_category_entity` (`entity_id`)

Когда начал разбираться, оказалось, что в базе данных в таблице catalog_category_product_index есть продукты которые привязаны к несуществующим категориям. Как такое могло произойти не выяснял, но факт остается фактом.

Мои действия  по исправлению ситуации:

  1. Первым делом в phpmyadmin я делаю вот такой sql запрос SELECT DISTINCT `catalog_category_entity`.`entity_id` FROM `catalog_category_entity`, `catalog_category_product_index` WHERE `catalog_category_entity`.`entity_id`=`catalog_category_product_index`.`category_id`, тем самым я узнаю сколько категорий имеют привязанные продукты.
  2. Нахожу все категории к которым привязан хоть один продукт вот таким запросом SELECT DISTINCT `catalog_category_product_index`.`category_id` FROM `catalog_category_product_index`.
  3. Сравниваю два полученных списка и нахожу категории которые есть в списке который получили во втором пункте, но их нет в списке из первого пункта. Это означает что этих категорий вообще нет, а связи с продуктами остались. Если категорий мало, то сравнивайте на глаз, если много, ищите другие инструменты для этого.
  4. Далее либо удаляем эти записи, либо меняем category_id на id существующей категории.
  5. Повторяем все те же действия только уже вот с такими запросами
    SELECT DISTINCT `catalog_category_entity`.`entity_id` FROM `catalog_category_entity`, `catalog_category_product` WHERE `catalog_category_entity`.`entity_id`=`catalog_category_product`.`category_id` 
    SELECT DISTINCT `catalog_category_product`.`category_id` FROM `catalog_category_product`
    
    

Надеюсь все понятно и это решение вам поможет при возникновении такой и подобных проблем.

Благодарю за внимание. Вопросы задавать в комментариях…

Оставить комментарий