2013-07-06 61 views
2

我正在使用php腳本創建新產品並更新Magento 1.7.0.2中的現有產品。 這個腳本可以很好地處理單個或幾百個產品。如果創建或更新大量的產品,說5000,得到以下錯誤Magento產品創建 - 違反完整性約束

SQLSTATE [23000]:完整性約束違規:1452不能添加或更新子行,外鍵約束失敗(magento_livecatalog_product_entity_varchar,約束FK_CAT_PRD_ENTT_VCHR_ENTT_ID_CAT_PRD_ENTT_ENTT_ID。外鍵(entity_id)參考文獻catalog_product_entityentity_id)ON d)

我使用的腳本,

const DEFAULT_STORE_ID=0; 
    const DEFAULT_VISIBILITY=4; 
    const DEFAULT_TAXCLASS=2; 

    /** 
    * @var Mage_Catalog_Model_Product 
    */ 
    protected $magentoProduct; 
    protected $errors=array(); 

    public function __construct() 
    { 
     Mage::app()->setCurrentStore(0); 
     Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 
     Mage::getSingleton('core/session', array('name' => 'adminhtml')); 
     $userModel=Mage::getModel('admin/user'); 
     $userModel->setUserId(1); 
     $session=Mage::getSingleton('admin/session'); 
     $session->setUser($userModel); 
     $session->setAcl(Mage::getResourceModel('admin/acl')->loadAcl()); 
    } 

    public function getErrors() 
    { 
     return $this->errors; 
    } 

    public function save($productData) 
    { 
     $start=microtime(true); 
     $this->magentoProduct=Mage::getModel('catalog/product'); 
     $magentoProductId=$this->magentoProduct->getIdBySku($productData['sku']); 
     $this->magentoProduct->load($magentoProductId); 

     if (!$this->magentoProduct->getId()) 
     { 
     mage::log("ADDING sku-" . $productData['sku']); 
      try 
      { 

      $this->magentoProduct->setWebsiteIds(array(1)); 
      $this->magentoProduct->setAttributeSetId($this->magentoProduct->getDefaultAttributeSetId()); 
      $this->magentoProduct->setStoreId(self::DEFAULT_STORE_ID); 
      $this->magentoProduct->setTypeId('simple'); 
      $this->magentoProduct->setSku($productData['sku']); 
      $this->magentoProduct->setName($productData['name']); 
      $this->magentoProduct->setDescription($productData['description']); 
      $this->magentoProduct->setShortDescription($productData['short_description']); 
      $this->magentoProduct->setPrice(floatval($productData['price'])); 

      $this->magentoProduct->setCost(floatval($productData['cost'])); 
      $this->magentoProduct->setIsImported($productData['is_imported']);    
      $this->magentoProduct->setMfgpartno($productData['mfgpartno']);    
      $this->magentoProduct->setEtilizeProductId($productData['etilize_product_id']); 
      $this->magentoProduct->setCondition($productData['condition']); 
      $this->magentoProduct->setManufacturer($productData['manufacture']); 

      $this->magentoProduct->setCategoryIds($productData['category_id']); // need to look these up 
      $this->magentoProduct->setWeight($productData['weight']); 
      $this->magentoProduct->setTaxClassId(self::DEFAULT_TAXCLASS); // taxable goods 
      $this->magentoProduct->setVisibility(self::DEFAULT_VISIBILITY); // catalog, search 
      $this->magentoProduct->setStatus(intval($productData['status'])); // enabled 
      $this->magentoProduct->setCategoryIds($productData['category_id']); 

      $this->magentoProduct->save(); 

      Mage::log("saving stock for new product"); 
       $stockItem = Mage::getModel('cataloginventory/stock_item'); 
       $stockItem->assignProduct($this->magentoProduct); 
       $qty = (integer)$productData['qty']; 
       $stockItem->setData('qty', $qty); 
       $stockItem->setData('is_in_stock', $qty > 0 ? 1:0); 
       $stockItem->setData('stock_id', $productData['stock_id']); 
       $stockItem->setData('manage_stock', 0); 
       $stockItem->save();    



      } 
      catch (Exception $e) 
      { 
       Mage::log("Failed Saving Product: " . $e->getMessage()); 
      } 

      $magentoProductId=$this->magentoProduct->getId(); 
      unset($this->magentoProduct); 
     } 
     else 
     { 
      mage::log("UPDATING sku-" . $productData['sku']); 
      try 
      { 


       $this->magentoProduct->setMfgpartno($productData['mfgpartno']);    
       $this->magentoProduct->setEtilizeProductId($productData['etilize_product_id']); 
       $this->magentoProduct->setCondition($productData['condition']); 
       $this->magentoProduct->setPrice(floatval($productData['price']));    
       $this->magentoProduct->setCost(floatval($productData['cost'])); 
       $this->magentoProduct->setWeight($productData['weight']); 
       $this->magentoProduct->setTaxClassId($productData['tax_class_id']); 
       $this->magentoProduct->setManufacturer($productData['manufacture']); 

       $qty=(integer)$productData['qty']; 
       $inStock=($qty > 0) ? 1 : 0; 
       $stockData = $this->magentoProduct->getStockData();     
       $stockData['qty'] = $qty; 
       $stockData['is_in_stock'] = $inStock; 
       $stockData['manage_stock'] = 1; 
       $stockData['use_config_manage_stock'] = 0; 
       $this->magentoProduct->setStockData($stockData);    


       $this->magentoProduct->save(); 
      } 
      catch (Exception $e) 
      { 
       Mage::log("Failed Update Product: " . $e->getMessage()); 
      } 

      $magentoProductId=$this->magentoProduct->getId(); 
      unset($this->magentoProduct); 
     } 
     return $magentoProductId; 
    } 

該腳本被放置我在Magneto自定義模塊中,我有數據庫表中的產品列表。我從這張表中選擇產品並使用上面的腳本更新或插入到magento中。該過程正在通過一個curl請求進行初始化。我還嘗試將其插入一批100或50個。在更新或插入大約3000個產品後,仍會得到相同的錯誤。在運行該過程之前,我還將索引模式更改爲手動模式。

任何幫助將非常感激。謝謝!

回答

1

問題不在於多少產品由於重複輸入而插入或更新,所以不要插入重複的數據。 Magento數據庫利用外鍵約束來確保數據庫的完整性。例如,如果某個類別被刪除,則該類別樹下的所有類別也必須被刪除。

Cannot add or update a child row: a foreign key constraint fails 

這個錯誤是因爲你正在導入的數據表提供的表格,一行一行,而不考慮數據庫的邏輯結構和完整性。

我在我的項目中插入產品類別時面臨同樣的問題,之後我使用了適當的檢查功能來避免這種類型的錯誤。我的問題是我曾使用外部id類別,但一些情況下外部id與原始id不匹配。

你可以做一件事,使用Mage日誌(你已經在使用)進行插入和更新,以檢查停止導入的產品。如果您發現問題ID,那麼檢查此特定ID的所有數據,並嘗試僅使用代碼導入/插入此特定數據。找出問題出現在哪個數據並修復它。讓我知道如果我能幫助你更多。

+0

我已經檢查過出現約束錯誤的產品,比如100個產品,創建產品不會給出任何錯誤。但是如果我嘗試創建10,000個產品,那麼它會在創建幾千個產品後給出約束違規錯誤。 –

+0

我已經使用代碼創建了30k個產品,並且我只在類別ID的重複條目中遇到此錯誤。但直到現在還面臨着一個問題就是'記憶力枯竭問題'。假設如果你開始插入10k產品,但是在3k之後你的問題發生了,那麼你開始從3k插入到4k,如果問題再次出現,那麼我確定它只適用於重複輸入,否則不適用。 – monojit

1

暫時擺脫了問題,你可以關閉mysql中的外鍵,但這當然不是合適的解決方案。我會檢查創建或更新產品時發生的崩潰。在創建的情況下,我會在保存新產品後檢查產品是否有ID,並且只有在存在此ID時才應用庫存數據。一般來說,要小心類別ID。希望這個對你有幫助!

相關問題