Проблемы с переиндексацией атрибутов продукта

magento.stackexchange https://magento.stackexchange.com/questions/9091

  •  16-10-2019
  •  | 
  •  

Вопрос

Что я должен делать, если индекс атрибутов продукта выдает ошибку, подобную этой:

Next exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '12692-214-1-11745' for key 'PRIMARY'' in /home/uitlaat/domains/uitlaatcity.nl/public_html/lib/Zend/Db/Statement/Pdo.php:234
Stack trace:
#0 /home/uitlaat/domains/uitlaatcity.nl/public_html/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)
#1 /home/uitlaat/domains/uitlaatcity.nl/public_html/lib/Zend/Db/Statement.php(300): Varien_Db_Statement_Pdo_Mysql->_execute(Array)
#2 /home/uitlaat/domains/uitlaatcity.nl/public_html/lib/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array)
#3 /home/uitlaat/domains/uitlaatcity.nl/public_html/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ca...', Array)
#4 /home/uitlaat/domains/uitlaatcity.nl/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php(419): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ca...', Array)
#5 /home/uitlaat/domains/uitlaatcity.nl/public_html/lib/Varien/Db/Adapter/Pdo/Mysql.php(1974): Varien_Db_Adapter_Pdo_Mysql->query('INSERT INTO `ca...', Array)
#6 /home/uitlaat/domains/uitlaatcity.nl/public_html/app/code/core/Mage/Catalog/Model/Resource/Product/Indexer/Eav/Source.php(276): Varien_Db_Adapter_Pdo_Mysql->insertArray('catalog_product...', Array, Array)
#7 /home/uitlaat/domains/uitlaatcity.nl/public_html/app/code/core/Mage/Catalog/Model/Resource/Product/Indexer/Eav/Source.php(257): Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source->_saveIndexData(Array)
#8 /home/uitlaat/domains/uitlaatcity.nl/public_html/app/code/core/Mage/Catalog/Model/Resource/Product/Indexer/Eav/Source.php(84): Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source->_prepareMultiselectIndex(NULL, NULL)
#9 /home/uitlaat/domains/uitlaatcity.nl/public_html/app/code/core/Mage/Catalog/Model/Resource/Product/Indexer/Eav/Abstract.php(50): Mage_Catalog_Model_Resource_Product_Indexer_Eav_Source->_prepareIndex()
#10 /home/uitlaat/domains/uitlaatcity.nl/public_html/app/code/core/Mage/Catalog/Model/Resource/Product/Indexer/Eav.php(185): Mage_Catalog_Model_Resource_Product_Indexer_Eav_Abstract->reindexAll()
#11 /home/uitlaat/domains/uitlaatcity.nl/public_html/app/code/core/Mage/Index/Model/Indexer/Abstract.php(143): Mage_Catalog_Model_Resource_Product_Indexer_Eav->reindexAll()
#12 /home/uitlaat/domains/uitlaatcity.nl/public_html/app/code/core/Mage/Index/Model/Process.php(209): Mage_Index_Model_Indexer_Abstract->reindexAll()
#13 /home/uitlaat/domains/uitlaatcity.nl/public_html/app/code/core/Mage/Index/Model/Process.php(255): Mage_Index_Model_Process->reindexAll()
#14 /home/uitlaat/domains/uitlaatcity.nl/public_html/shell/indexer.php(158): Mage_Index_Model_Process->reindexEverything()
#15 /home/uitlaat/domains/uitlaatcity.nl/public_html/shell/indexer.php(198): Mage_Shell_Compiler->run()
#16 {main}

У кого есть какие-то решения, может быть, мне поможет, если я урежу некоторые таблицы.

Это было полезно?

Решение

Я отладил шаг за шагом и нашел точную причину трассировки, указанную выше.У меня есть пользовательский скрипт для импорта продуктов в Magento, и при создании нового продукта скрипт присваивает продукту значения атрибутов multiselect.Некоторые продукты имеют один идентификатор опции два или более раз, и во время индексации это может быть причиной некоторой ошибки, такой как "Нарушение ограничения целостности".Если я опишу это с помощью кода:

$_product->setSomeMultiselectAttribute(array(option_id_1, option_id_2, option_id_1));
$_product->save();

После завершения импорта я выполняю индексацию, и появится исключение, указанное выше.Таким образом, я исправил свою ошибку:

$_product->setSomeMultiselectAttribute(array_unique(array(option_id_1, option_id_2, option_id_1)));

Может быть, это поможет кому-нибудь в будущем.И исключение исчезло.

Другие советы

В большинстве случаев это связано с тем, что в таблицах flat_catalog возникает проблема со вставкой ключа, который уже есть в базе данных, т.е.ограничение первичного ключа.Их усечение действительно хороший вариант, ключи будут очищены, и вы сможете переиндексировать их позже.

В mysql: (имейте в виду, что ваши плоские таблицы могут иметь разные названия)

TRUNCATE TABLE `catalog_category_flat_store_1`;

Затем выполните переиндексацию из adminpanel или через терминал, выполнив shell-скрипт переиндексации из корневого каталога Magento следующим образом:

php shell/indexer.php --reindex catalog_product_flat 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top