Magento - 订单保存错误:SQLSTATE [23000]:完整性约束违规

时间:2012-05-16 21:10:50

标签: mysql magento

有时,当我们在后端下订单时 - 如果有新客户,我们会在提交时收到以下错误:

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

3 个答案:

答案 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_enterpriseenterprise_reward,CONSTRAINT   FK_REWARD_CUSTOMER_ID FOREIGN KEY(customer_id)参考   customer_entityentity_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

重现的步骤:

  • 启用Magento Enterprise并启用Enterprise Rewards(或其他 具有类似代码的模块,见下文)
  • 使用支持在线授权的付款模块
  • 以新客户的身份查看订单
  • 触发付款错误(例如输入无效的CC否)。

我附加了一个PHPUnit测试用例,可以可靠地重现问题。

罪魁祸首是Mage_Sales_Model_Service_Quote :: submitOrder中执行以下操作的代码:

  1. 开始交易
  2. 建立新订单
  3. 创建新客户并填写订单的customerId字段
  4. 尝试处理订单,这会引发异常
  5. 回滚交易
  6. 使用订单作为事件数据发送“quote_submit_failure”事件。请注意,订单的customerId字段现在包含无效值,因为事务已回滚。
  7. 现在,如果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中提交核心修改。这不酷。

来源:Aftab Naveed's Blog

答案 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;
}