Не удается повторно проиндексировать новые продукты после обновления до версии 1.6

#php #magento

#php #magento

Вопрос:

Я обновил свой сайт с версии 1.4.0.1 до версии 1.6. Я удалил все продукты с веб-сайта и выполнил «переиндексацию всех», которая была успешно завершена. Когда я пытаюсь создать новый продукт, а затем снова выполнить повторную индексацию, я получаю эту ошибку :

 Product Attributes index process unknown error:
exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`.../catalog_product_index_eav`, CONSTRAINT `FK_CAT_PRD_IDX_EAV_ENTT_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`entity_id`) REFERENCES `catalog_product_entity` (`entity_id`) ON DELETE CAS)' in .../lib/Zend/Db/Statement/Pdo.php:228
  

Я пытался TRUNCATE TABLE catalog_product_index_eav , но это не помогло.

Как я могу это исправить?

Комментарии:

1. Если вы выполняете крупное обновление и удаляете все продукты, возможно, было бы проще начать заново и импортировать клиентов.

2. У меня есть много атрибутов костюма и содержимого CMS, копирование которых займет много времени. К сожалению, не похоже, что magento предлагает экспорт и импорт этой информации.

Ответ №1:

Это удаляет только нежелательные данные, которых там быть не должно.

Я расширил вышесказанное, поскольку это может сэкономить несколько часов копания:

 delete FROM `catalog_product_entity_datetime` where entity_id not in (select entity_id from catalog_product_entity);
delete FROM `catalog_product_entity_decimal` where entity_id not in (select entity_id from catalog_product_entity);
delete FROM `catalog_product_entity_gallery` where entity_id not in (select entity_id from catalog_product_entity);
delete FROM `catalog_product_entity_group_price` where entity_id not in (select entity_id from catalog_product_entity);
delete FROM `catalog_product_entity_int` where entity_id not in (select entity_id from catalog_product_entity);
delete FROM `catalog_product_entity_media_gallery` where entity_id not in (select entity_id from catalog_product_entity);
delete FROM `catalog_product_entity_text` where entity_id not in (select entity_id from catalog_product_entity);
delete FROM `catalog_product_entity_tier_price` where entity_id not in (select entity_id from catalog_product_entity);
delete FROM `catalog_product_entity_varchar` where entity_id not in (select entity_id from catalog_product_entity);
#originals with formatting fixed:
delete from `catalog_category_product` WHERE product_id not in(select entity_id from catalog_product_entity);
delete from `catalog_category_product` WHERE category_id not in(select entity_id from catalog_category_entity); 
delete from `catalog_product_website` WHERE product_id not in(select entity_id from catalog_product_entity); 
delete from `catalog_product_index_eav_idx` WHERE entity_id not in(select entity_id from catalog_product_entity); 
delete from `catalog_product_index_eav` WHERE entity_id not in(select entity_id from catalog_product_entity); 
delete from `catalog_product_link` WHERE product_id not in(select entity_id from catalog_product_entity); 
delete from `catalog_product_relation` WHERE parent_id not in(select entity_id from catalog_product_entity);
  

Комментарии:

1. Я обнаружил, что это также помогает при ошибке ограничения FK_CAT_PRD_FLAT_1_ENTT_ID_CAT_PRD_ENTT_ENTT_ID DELETE pf1.* FROM catalog_product_flat_1 pf1 LEFT JOIN catalog_product_entity p ON pf1.entity_id = p.entity_id WHERE ISNULL( p.entity_id )

2. Это то, что я искал долгое время. Спасибо, чувак!

Ответ №2:

Я использовал следующие запросы для очистки таблиц каталога;

 delete from `catalog_category_product` WHERE product_id not in(select entity_id from catalog_product_entity)

delete from `catalog_category_product` WHERE category_id not in(select entity_id from catalog_category_entity) 

delete from ` catalog_product_website` WHERE product_id not in(select entity_id from catalog_product_entity) 

delete from ` catalog_product_entity_media_gallery` WHERE entity_id not in(select entity_id from catalog_product_entity) 

delete from ` catalog_product_index_eav_idx` WHERE entity_id not in(select entity_id from catalog_product_entity) 

delete from ` catalog_product_index_eav` WHERE entity_id not in(select entity_id from catalog_product_entity) 

delete from ` catalog_product_link` WHERE product_id not in(select entity_id from catalog_product_entity) 

delete from ` catalog_product_relation` WHERE parent_id not in(select entity_id from catalog_product_entity)
  

После этого я смог выполнить переиндексацию из панели администратора.

Комментарии:

1. Запросы sql говорят «удалить текст или удалить числа, если продукт больше не существует в основной таблице продуктов», так что да, это удаление данных, но его удаление данных, которые в любом случае вызвали бы проблемы с ограничениями при индексации. Это похоже на то, что руки и ноги плавают вокруг без какого-либо тела. Давайте избавимся от этих вещей.

Ответ №3:

Если вы делаете это на действующем сайте, вам, вероятно, нужно выполнить процесс переиндексации из командной строки при выключенном Apache.

http://overlycaffeinated.com/2011/02/when-reindexing-in-magento-fails-use-the-command-line/

Здесь объясняется, как это сделать.

Комментарии:

1. Я выполняю процесс переиндексации из командной строки в среде разработки только с одним тестовым продуктом (который я создал после удаления всех продуктов). Индексация работает нормально, когда продуктов нет