2012-11-20 42 views
0

我試圖解決更新問題或從文件(csv)插入新產品到數據庫。如何在一個腳本中使用SELECT多個(500 000)次?

問題是,在CSV文件只數和產品供應商。所以我需要爲每個產品尋找這個供應商和編號的ID。如果產品不在我需要插入新的,否則我只會更新存儲信息和價格。

該csv有500 000個產品(34MB)。

現在我'像這樣的代碼解決這個(但腳本停止,因爲沒有存儲空間(使用2GB)經過50個000文件行:

 while (!feof($file_handle)) 
    { 
     $data = fgetcsv($file_handle,5096,$i->column_separator); 

     if($row >= ($i->firstrow-1) && !empty($data[$i->column_product_code-1]) && !empty($data[$i->column_product_name-1]) && !empty($data[$i->column_price-1]) && $data[$i->column_price-1] > 0) 
     {        
      @$code = str_replace(array(' ','.','-','/'),'',$data[$i->column_product_code-1]); 
      @$supplier = iconv('WINDOWS-1250','UTF-8', $data[$i->column_producer_name-1]); 
      @$name = iconv('WINDOWS-1250','UTF-8', $data[$i->column_product_name-1]); 

      $article = $articleModel->searchImport($code,$supplier,isset($data[$i->column_producer_code-1]) ? $data[$i->column_producer_code-1]:NULL); 

      if($article !== FALSE) 
      { 
       $importqueueModel->update() 
      } 
      else 
      { 
       $importqueueModel->insert() 
      } 

我找不出任何不同的步驟如何搭配從文件產品代碼和供應商從數據庫中獲得的ID,這樣我就可以更新或插入新的產品返回到數據庫中。

請幫幫忙,任何提示將不勝感激。

謝謝

+0

你得到一些錯誤?您能否準確提供所寫的內容? – HamZa

+0

你真的需要這樣做嗎?你看過mysqlimport嗎? http://dev.mysql.com/doc/refman/5.0/en/mysqlimport.html –

回答

0

您的代碼中某處存儲有關從CSV文件中讀取的每行的數據。這似乎沒有包含在您發佈的不完整片段中,除非它是$articleModel->searchImport()方法調用的一部分。

如果你幸運的話,你已經從很有幫助您的文章省略了錯誤/異常消息可能直接指向的問題就行了。

0

你可以在你的$importQueueModel添加一個新的方法來支持MySQL的擴展插入語句ON DUPLICATE UPDATE。 這不會是便攜式的,但會解決您當前的問題。

另一個(更好)的解決方案是寫一個MySQL腳本來處理更新。您可以修改您的PHP腳本以輸出SQL,然後單獨運行它。

INSERT參考手冊。

3

作爲一個一般的經驗法則,如果你認爲你需要在腳本中運行數百個查詢,那麼你就錯了。成千上萬的?非常錯誤。

從CSV數據不直接加載到其中已經包含實時數據的目標表 - 它加載到一個臨時表 - 那麼單個插入....選擇將填充相關的記錄:

INSERT INTO suppliers (name, status) 
SELECT c.supplier, 'new' 
FROM csv_imported c 
LEFT JOIN suppliers s 
ON c.supplier=s.name 
WHERE s.name is NULL 
AND c.supplier IS NOT NULL; 

使用mysqlimport/load數據infile消除了大量代碼的需求。

因爲沒有存儲空間(使用2GB)

即使這樣做了錯誤的方式不會導致這樣的問題 - 你有你的代碼中的錯誤。

相關問題