06
Ошибка индексации в magento
Magento, Баги, глюки, ошибки, недочеты, Программирование
Метки (теги) : bug, foreign key, magento, php, sql
При обновлении интернет магазина 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 есть продукты которые привязаны к несуществующим категориям. Как такое могло произойти не выяснял, но факт остается фактом.
Мои действия по исправлению ситуации:
- Первым делом в 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`, тем самым я узнаю сколько категорий имеют привязанные продукты.
- Нахожу все категории к которым привязан хоть один продукт вот таким запросом SELECT DISTINCT `catalog_category_product_index`.`category_id` FROM `catalog_category_product_index`.
- Сравниваю два полученных списка и нахожу категории которые есть в списке который получили во втором пункте, но их нет в списке из первого пункта. Это означает что этих категорий вообще нет, а связи с продуктами остались. Если категорий мало, то сравнивайте на глаз, если много, ищите другие инструменты для этого.
- Далее либо удаляем эти записи, либо меняем category_id на id существующей категории.
- Повторяем все те же действия только уже вот с такими запросами
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`
Надеюсь все понятно и это решение вам поможет при возникновении такой и подобных проблем.
Благодарю за внимание. Вопросы задавать в комментариях…