2012-05-16 43 views
0

有時,當我們把在後端的訂單 - 與新客戶,我們在提交它收到以下錯誤:的Magento - 訂單節約錯誤:SQLSTATE [23000]:完整性約束衝突

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

如果您使用的企業版,我會建議提交支持票與Varien。並不是說這裏的某個人不會幫助你,但支持是你付出的一部分。 –

+0

在我看來,我認爲發生的事情是系統在客戶在系統中創建之前試圖給予客戶獎勵。 –

+0

http://seanbreeden.com/post/14693198343/fk-reward-customer-id-foreign-key-error-in-magento可能會有幫助,但直接勸阻編譯內核,只是轉移到本地來代替。 – B00MER

回答

0

我們的企業1.10.0.1確實遇到了同樣的問題。這似乎是已經與Varien一起提交的已知錯誤。但是 - 我還沒有找到解決方案。

我能找到的最好的事情是這個線程:http://www.magentocommerce.com/boards/v/viewthread/234872

我發現的bug報告是貼在下面。

BUG ID:26516 發佈:

Zend_Db_Statement_Exception: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (magento_enterprise . enterprise_reward , CONSTRAINT FK_REWARD_CUSTOMER_ID FOREIGN KEY (customer_id) REFERENCES customer_entity (entity_id) ON DELETE 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 
:2011-09-21 15時22分十八秒

當支付處理與異常發生故障時,在某些情況下會出現以下錯誤

重現步驟:

  • 使用啓用了企業獎勵的Magento Enterprise(或其他 模塊用類似的代碼,見下文)
  • 使用支持上行授權
  • 簽出的順序爲新的客戶
  • 觸發付款錯誤支付模塊(例如通過輸入無效的CC號)。

接上一個應可靠地重現該問題的PHPUnit測試用例。

罪魁禍首是Mage_Sales_Model_Service_Quote :: submitOrder,做了以下代碼:

  1. 啓動事務
  2. 建立一個新秩序
  3. 創建一個新的客戶和訂單的客戶ID字段
  4. 填寫
  5. 嘗試處理訂單,這會引發異常
  6. 回滾事務
  7. 使用訂單作爲事件數據發送「quote_submit_failure」事件。請注意,訂單的customerId字段現在包含無效值,因爲事務已被回滾。

現在,如果quote_submit_failure處理程序進行使用訂單的客戶ID,它必然引發前述的「完整性約束衝突」錯誤。

這個問題可以在下面的版本重現: - Magento企業版v1.10.0.1 - Magento的社區版v1.6.0.0(只要恰好是期待一個有效的customerId一個quote_submit_failure處理器

0

您還可以添加$此 - > _ stmt->的queryString到Zend_Db_Statement_Exception在LIB/Zend公司/數據庫/聲明/ Pdo.php(_execute法),看看有什麼查詢引發錯誤

這將是像..

throw new Zend_Db_Statement_Exception($e->getMessage() . $this->_stmt->queryString, (int) $e->getCode(), $e); 

但要記住:不要在Magento提交核修改。這不是很酷。

來源:Aftab Naveed's Blog

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; 
} 
相關問題