有时,当我们在后端下订单时 - 如果有新客户,我们会在提交时收到以下错误:
Order saving error: SQLSTATE[23000]: Integrity constraint violation: 1452
Cannot add or update a child row: a foreign key constraint fails
`artizara_artizara/enterprise_reward`, CONSTRAINT `FK_REWARD_CUSTOMER_ID`
FOREIGN KEY (`customer_id`) REFERENCES customer_entity` (`entity_id`)
ON DELETE CASCADE ON UPDATE CASCADE)
我查了错误日志,并说出以下内容:
exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint
violation: 1452 Cannot add or update a child row: a foreign key constraint fails
(`artizara_artizara/enterprise_reward`, CONSTRAINT `FK_REWARD_CUSTOMER_ID`
FOREIGN KEY (`customer_id`) REFERENCES `customer_entity` (`entity_id`) ON DELETE
CASCADE ON UPDATE CASCADE)' in /chroot/home/artizara/artizara.com/html/lib/Zend/Db/Statement/Pdo.php:228
我在谷歌/ Magento论坛上研究了这个问题,有些人说它与表不是InnobDB有关...
所以我进入phpMyAdmin并拉出enterprise_reward
表。打开操作标签。在存储引擎旁边,它说InnoDB所以我想我已经在那里......
其他人尝试通过搜索孤儿数据来为他们的问题制作sql语句。我不太确定这是在寻找什么,所以我不知道如何将sql语句放在一起(无论如何我还是有点新的。)
请有人帮忙解决这个问题(通过搜索孤儿数据等),也许让我知道为什么会发生这种情况?
仅供参考 - 他们无法清楚地了解每个新客户(在管理员处下订单时)或有时是否会发生这种情况 - 所以我还没有这个信息(还)...
编辑5/16 @ 2:30p:
我试过用这个sql代码寻找孤儿,但没有结果返回 ......
SELECT
*
FROM
enterprise_reward
LEFT
JOIN
customer_entity
ON enterprise_reward.customer_id = customer_entity.entity_id
WHERE
customer_entity.entity_id IS NULL
答案 0 :(得分:0)
我们确实在企业1.10.0.1上遇到过同样的问题。这似乎是已经提交给Varien的已知错误。但是 - 我还没有找到解决方案。
我能找到的最好的东西就是这个帖子:http://www.magentocommerce.com/boards/v/viewthread/234872
我发现的错误报告发布在下面。
BUG ID:26516 发表时间:2011-09-21 15:22:18
如果付款处理因异常而失败,则在某些情况下会发生以下错误:
Zend_Db_Statement_Exception:SQLSTATE [23000]:完整性约束 违规:1452无法添加或更新子行:外键 约束失败(
magento_enterprise
。enterprise_reward
,CONSTRAINTFK_REWARD_CUSTOMER_ID
FOREIGN KEY(customer_id
)参考customer_entity
(entity_id
)ON UPETE CASCADE ON UPDATE CASCADE)
./lib/Zend/Db/Statement/Pdo.php:234
./lib/Zend/Db/Statement.php:300
./lib/Zend/Db/Adapter/Abstract.php:479
./lib/Zend/Db/Adapter/Pdo/Abstract.php:238
./lib/Varien/Db/Adapter/Pdo/Mysql.php:333
./lib/Zend/Db/Adapter/Abstract.php:574
./app/code/core/Mage/Core/Model/Mysql4/Abstract.php:414
./app/code/core/Mage/Core/Model/Abstract.php:318
./app/code/core/Enterprise/Reward/Model/Reward.php:202
./app/code/core/Enterprise/Reward/Model/Observer.php:548
./app/code/core/Enterprise/Reward/Model/Observer.php:564
./app/code/core/Mage/Core/Model/App.php:1265
./app/code/core/Mage/Core/Model/App.php:1246
./app/Mage.php:416
./app/code/core/Mage/Sales/Model/Service/Quote.php:187
./app/code/core/Mage/Sales/Model/Service/Quote.php:126
./EnterpriseRewardTest.php:70
重现的步骤:
我附加了一个PHPUnit测试用例,可以可靠地重现问题。
罪魁祸首是Mage_Sales_Model_Service_Quote :: submitOrder中执行以下操作的代码:
现在,如果quote_submit_failure的处理程序继续使用order的customerId,则必然会触发上述“完整性约束违规”错误。
可以在以下版本中重现该问题: - Magento Enterprise Edition v1.10.0.1 - Magento Community Edition v1.6.0.0(前提是有一个quote_submit_failure处理程序,它需要一个有效的customerId。
答案 1 :(得分:0)
您还可以在lib / Zend / Db / Statement / Pdo.php(_execute方法)中将 $ this-> _stmt-> queryString 添加到Zend_Db_Statement_Exception,以查看引发错误的查询
这将是......
throw new Zend_Db_Statement_Exception($e->getMessage() . $this->_stmt->queryString, (int) $e->getCode(), $e);
但请记住:不要在Magento中提交核心修改。这不酷。
答案 2 :(得分:0)
如果使用1.10.0.1或更低版本,请通过添加对客户ID的检查来修补此文件app/code/core/Enterprise/Reward/Model/Observer.php
protected function _revertRewardPointsForOrder(Mage_Sales_Model_Order $order)
{
// Patch for known 1.10.0.1 bug
if (!$order->getCustomer()->getId()) {
return $this;
}
// End patch
Mage::getModel('enterprise_reward/reward')
->setCustomerId($order->getCustomerId())
->setWebsiteId(Mage::app()->getStore($order->getStoreId())->getWebsiteId())
->setPointsDelta($order->getRewardPointsBalance())
->setAction(Enterprise_Reward_Model_Reward::REWARD_ACTION_REVERT)
->setActionEntity($order)
->updateRewardPoints();
return $this;
}