【问题标题】:MySQL error when editing product in Magento在 Magento 中编辑产品时出现 MySQL 错误
【发布时间】:2010-12-07 12:20:48
【问题描述】:

它是 v 1.4.1.1 Magento,从 v 1.3.2.4 升级
当我尝试编辑产品时出现错误消息:

exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '6028-0-2' for key 'PRIMARY''

如果我尝试重新索引价格,我会在 exception.log 中看到相同的消息
我认为问题出在 catalog_product_website 表中,因为如果我删除该行,我可以运行价格索引,但是当我尝试编辑产品以为其分配网站时,我得到了相同的消息。
奇怪的是,catalog_product_website 表只有 2 列,并且异常涉及 3 个主键表(对吗?)
这是整个堆栈跟踪:

2010-12-07T12:12:41+00:00 ERR (3):
exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '6028-0-2' for key 'PRIMARY'' in /var/www/ortoweb1314/lib/Zend/Db/Statement/Pdo.php:234
Stack trace:
#0 /var/www/ortoweb1314/lib/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)
#1 /var/www/ortoweb1314/lib/Zend/Db/Adapter/Abstract.php(468): Zend_Db_Statement->execute(Array)
#2 /var/www/ortoweb1314/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ca...', Array)
#3 /var/www/ortoweb1314/lib/Varien/Db/Adapter/Pdo/Mysql.php(333): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ca...', Array)
#4 /var/www/ortoweb1314/app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Indexer/Price/Default.php(260): Varien_Db_Adapter_Pdo_Mysql->query('INSERT INTO `ca...')
#5 /var/www/ortoweb1314/app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Indexer/Price/Default.php(133): Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Price_Default->_prepareFinalPriceData('6028')
#6 /var/www/ortoweb1314/app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Indexer/Price.php(192): Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Price_Default->reindexEntity('6028')
#7 /var/www/ortoweb1314/app/code/core/Mage/Index/Model/Indexer/Abstract.php(144): Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Price->catalogProductSave(Object(Mage_Index_Model_Event))
#8 /var/www/ortoweb1314/app/code/core/Mage/Catalog/Model/Product/Indexer/Price.php(255): Mage_Index_Model_Indexer_Abstract->callEventHandler(Object(Mage_Index_Model_Event))
#9 /var/www/ortoweb1314/app/code/core/Mage/Index/Model/Indexer/Abstract.php(85): Mage_Catalog_Model_Product_Indexer_Price->_processEvent(Object(Mage_Index_Model_Event))
#10 /var/www/ortoweb1314/app/code/core/Mage/Index/Model/Process.php(185): Mage_Index_Model_Indexer_Abstract->processEvent(Object(Mage_Index_Model_Event))
#11 [internal function]: Mage_Index_Model_Process->processEvent(Object(Mage_Index_Model_Event))
#12 /var/www/ortoweb1314/app/code/core/Mage/Index/Model/Indexer.php(252): call_user_func_array(Array, Array)
#13 /var/www/ortoweb1314/app/code/core/Mage/Index/Model/Indexer.php(154): Mage_Index_Model_Indexer->_runAll('processEvent', Array)
#14 /var/www/ortoweb1314/app/code/core/Mage/Index/Model/Indexer.php(219): Mage_Index_Model_Indexer->indexEvent(Object(Mage_Index_Model_Event))
#15 /var/www/ortoweb1314/app/code/core/Mage/Catalog/Model/Product.php(525): Mage_Index_Model_Indexer->processEntityAction(Object(Mage_Catalog_Model_Product), 'catalog_product', 'save')
#16 [internal function]: Mage_Catalog_Model_Product->afterCommitCallback()
#17 /var/www/ortoweb1314/app/code/core/Mage/Core/Model/Resource/Abstract.php(104): call_user_func(Array)
#18 /var/www/ortoweb1314/app/code/core/Mage/Core/Model/Abstract.php(310): Mage_Core_Model_Resource_Abstract->commit()
#19 /var/www/ortoweb1314/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php(663): Mage_Core_Model_Abstract->save()
#20 /var/www/ortoweb1314/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Adminhtml_Catalog_ProductController->saveAction()
#21 /var/www/ortoweb1314/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('save')
#22 /var/www/ortoweb1314/app/code/core/Mage/Core/Controller/Varien/Front.php(177): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#23 /var/www/ortoweb1314/app/code/core/Mage/Core/Model/App.php(304): Mage_Core_Controller_Varien_Front->dispatch()
#24 /var/www/ortoweb1314/app/Mage.php(596): Mage_Core_Model_App->run(Array)
#25 /var/www/ortoweb1314/index.php(80): Mage::run('', 'store')
#26 {main}

我希望有人能帮助我,我现在真的不知道:(

编辑:我已经增强了异常日志的消息,所以我可以看到整个查询,这里是:

#2 /var/www/ortoweb1314/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query(
    "INSERT INTO `catalog_product_index_price_final_tmp` SELECT `e`.`entity_id`, `cg`.`customer_group_id`, `cw`.`website_id`, ta_tax_class_id.value AS `tax_class_id`, ta_price.value AS `orig_price`, IF(IF(ta_special_from_date.value IS NULL, 1, IF(DATE(ta_special_from_date.value) <= cwd.date, 1, 0)) > 0 AND IF(ta_special_to_date.value IS NULL, 1, IF(DATE(ta_special_to_date.value) >= cwd.date, 1, 0)) > 0 AND ta_special_price.value < ta_price.value, ta_special_price.value, ta_price.value) AS `price`, IF(IF(ta_special_from_date.value IS NULL, 1, IF(DATE(ta_special_from_date.value) <= cwd.date, 1, 0)) > 0 AND IF(ta_special_to_date.value IS NULL, 1, IF(DATE(ta_special_to_date.value) >= cwd.date, 1, 0)) > 0 AND ta_special_price.value < ta_price.value, ta_special_price.value, ta_price.value) AS `min_price`, IF(IF(ta_special_from_date.value IS NULL, 1, IF(DATE(ta_special_from_date.value) <= cwd.date, 1, 0)) > 0 AND IF(ta_special_to_date.value IS NULL, 1, IF(DATE(ta_special_to_date.value) >= cwd.date, 1, 0)) > 0 AND ta_special_price.value < ta_price.value, ta_special_price.value, ta_price.value) AS `max_price`, tp.min_price AS `tier_price`, tp.min_price AS `base_tier` FROM `catalog_product_entity` AS `e`
 INNER JOIN `customer_group` AS `cg`
 INNER JOIN `core_website` AS `cw`
 INNER JOIN `catalog_product_index_website` AS `cwd` ON cw.website_id = cwd.website_id
 INNER JOIN `core_store_group` AS `csg` ON csg.website_id = cw.website_id AND cw.default_group_id = csg.group_id
 INNER JOIN `core_store` AS `cs` ON csg.default_store_id = cs.store_id AND cs.store_id != 0
 INNER JOIN `catalog_product_website` AS `pw` ON pw.product_id = e.entity_id AND pw.website_id = cw.website_id
 LEFT JOIN `catalog_product_index_tier_price` AS `tp` ON tp.entity_id = e.entity_id AND tp.website_id = cw.website_id AND tp.customer_group_id = cg.customer_group_id
 INNER JOIN `catalog_product_entity_int` AS `tad_status` ON tad_status.entity_id = e.entity_id AND tad_status.attribute_id = 80 AND tad_status.store_id = 0
 LEFT JOIN `catalog_product_entity_int` AS `tas_status` ON tas_status.entity_id = e.entity_id AND tas_status.attribute_id = 80 AND tas_status.store_id = cs.store_id
 LEFT JOIN `catalog_product_entity_int` AS `ta_tax_class_id` ON ta_tax_class_id.entity_id = e.entity_id AND ta_tax_class_id.attribute_id = 81 AND ta_tax_class_id.store_id = 0
 LEFT JOIN `catalog_product_entity_decimal` AS `ta_price` ON ta_price.entity_id = e.entity_id AND ta_price.attribute_id = 60 AND ta_price.store_id = 0
 LEFT JOIN `catalog_product_entity_decimal` AS `ta_special_price` ON ta_special_price.entity_id = e.entity_id AND ta_special_price.attribute_id = 61 AND ta_special_price.store_id = 0
 LEFT JOIN `catalog_product_entity_datetime` AS `ta_special_from_date` ON ta_special_from_date.entity_id = e.entity_id AND ta_special_from_date.attribute_id = 62 AND ta_special_from_date.store_id = 0
 LEFT JOIN `catalog_product_entity_datetime` AS `ta_special_to_date` ON ta_special_to_date.entity_id = e.entity_id AND ta_special_to_date.attribute_id = 63 AND ta_special_to_date.store_id = 0
 INNER JOIN `cataloginventory_stock_status` AS `ciss` ON ciss.product_id = e.entity_id AND ciss.website_id = cw.website_id WHERE (e.type_id='simple') AND (IF(tas_status.value_id > 0, tas_status.value, tad_status.value)=1) AND (e.entity_id IN('6028')) AND (ciss.stock_status=1)",
    array(
    ),
)

整个 excpetion.log 文件在这里:http://www.dowhiletrue.net/exception.txt.tar.gz

【问题讨论】:

  • parloir 您是如何进行升级的?你是从命令行做的吗?几周前我刚刚将 1.3 升级到 1.4,这是一场噩梦。我学到的技巧是你必须备份你的数据库,创建一个全新的数据库,加载你备份的数据,然后重新安装(我首先尝试了许多其他方法,并且总是遇到外键冲突,直到我这样做如上所述)。
  • 好吧,实际上我删除了所有 v1.3 文件并用 v1.4 替换它们,然后我运行安装,连接到我用于 1.3 的数据库
  • 这可能是你的问题。我尝试不删除数据库,但总是遇到关键错误。当您删除摆脱关键冲突的数据库时,会发生一些事情。如果您还没有尝试过,我会尝试这里列出的方法webshopapps.com/blog/2010/02/… 接受我的建议,不要跳过任何步骤 :)

标签: mysql magento indexing


【解决方案1】:

看来问题不在catalog_product_website 表中。价格索引表的问题,可能有一些旧版本的旧记录,应该删除。我建议您重新索引所有索引。完整的重新索引过程首先清除索引表,然后用数据填充表。它应该有帮助。

如果完全重新索引没有帮助,那么您的分期付款可能具有观察prepare_catalog_product_price_index_table 事件的模块,该事件以附加连接的方式修改重新索引选择,使具有相同主键的行数成倍增加。它也可能导致这样的错误。

干杯, 伊万

【讨论】:

  • 嗨伊万,谢谢回答。我做了完整的重新索引,清空缓存/会话/锁定目录,然后再次编辑产品,同样的错误:(
  • 我也在app/目录下搜索prepare_catalog_product_price_index_table,它只出现在CatalogRule/etc/config.xml中(除了dispatchEvents)。我删除了我的目录规则,再次清空了所有 var/ 目录,但同样的消息......还有什么想法吗?
  • 转储您的数据库,重新创建它并再次导入转储,看看它是否能解决您的问题
  • @anton:实际上,我正在使用的数据库是我今天早上丢弃的 prod 的转储......但无论如何我都会尝试一下。我会及时通知你
  • 从你的堆栈跟踪中我看到Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Indexer_Price_Default::_prepareFinalPriceData()方法中的问题根源,也尝试寻找这个事件prepare_catalog_product_index_select
【解决方案2】:

这听起来很愚蠢,因为您得到了重复的 -- auto_incremented -- 键,您是否尝试过增加该表的 auto_increment 值?假设这在某种程度上是一个冲突的数据库状态,这将解决问题。如果您将 PK 跳跃 100 并且您仍然遇到 PK 违规,那么代码可能会尝试插入相同的记录两次。

这将是相关的查询:

ALTER TABLE catalog_product_website AUTO_INCREMENT=1234

【讨论】:

  • 似乎有包含product_idcustomer_group_idwebsite_id的复杂主键
  • 嗨约瑟夫,我已经编辑了我的问题,因为现在我可以看到整个未截断的痕迹。我们现在可以看到问题出在 catalog_product_index_price_final_tmp 表中,该表没有 auto_increment 值
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2019-10-08
相关资源
最近更新 更多