2012-04-20 51 views
1

我想知道如果數據存在,那麼必須有mysql更新查詢,否則將數據插入到mysql表中。如果數據存在,如何執行更新查詢否則將數據插入到Mysql中?

我所做的是,我使用fgetcsv()函數將.csv文件中的數據提取到mysql中。 然後從csv &讀取每行,將這四個值放入四個變量&,然後觸發更新查詢。 SO我怎麼能檢查,如果一個數據不存在還是更新查詢工作(0行成功更新),所以我想確定數據& 插入到這臺否則,如果數據提出我更新查詢將工作。

我想更新或插入到product_entity_price表中的數據。 我的腳本 - :

if(($handle = fopen("/data/sample/items_0420.csv", "r")) !== FALSE) 
    {   
     while (($data = fgetcsv($handle, 8000, ",")) !== FALSE)  
     { 
     $num = count($data); 
     for ($c=0; $c < $num; $c++) 
     {    
      $temp = $data;    
      $string = implode(";", $temp);   
     } 
      $pieces = explode(";", $string);    
      $col1 = $pieces[0]; 
      $col2 = $pieces[1];   
      $col3 = $pieces[2];    
      $col4 = $pieces[3]; 

    $query_insert = "INSERT INTO import_prices (customer_id, sku, price, website) ".    
    "VALUES($col1,'$col2',$col3,'$col4') ".    
    "ON DUPLICATE KEY UPDATE customer_id=$col1, price=$col3,website='$col4' "; 
     $result = mysql_query($query_insert); 

      $query_update = "UPDATE product_entity_price pep 
      JOIN catalog_product cp ON cp.entity_id = pep.entity_id  
      AND cp.sku LIKE '$col2' AND website_id = $col4 
      JOIN customer_group cg ON cg.customer_group_id = pep.customer_group_id AND cg.customer_group_code = $col1 
SET cpetp.value = ".$col3.";"; 
      mysql_query($query_update); 
      } 
    } 
+0

'INSERT INTO ... ON DUPLICATE KEY UPDATE'應該已經這樣做了。任何錯誤? – CodeCaster 2012-04-20 13:57:20

+0

你在'import_prices'表中有唯一的鍵嗎? – Travesty3 2012-04-20 13:57:45

+0

HI CodeCaster,INSERT INTO ... ON DUPLICATE KEY UPDATE工作正常...但我想更新或插入另一張表product_entity_price ...&我們使用ON DUPLICATE KEY UPDATE對某些約束,如唯一鍵或主鍵。 ..但是在product_entity_price中沒有唯一的密鑰... – Prat 2012-04-20 14:12:13

回答

1

我想你想要的是MySQL UPSERT,否則稱爲INSERT...ON DUPLICATE KEY UPDATE

+1

這已經在他的代碼 – SupremeDud 2012-04-20 13:58:59

+0

這仍然是正確的答案。檢查鑰匙是有價值的。 – 2012-04-20 14:04:04

1

如果你如果行被刪除,如果重複,並再次插入不關心,那麼你可以使用REPLACE

REPLACE into table (col1, col2) values(val1, val2) 
+0

如果您有很多要插入/更新的行,請小心。 http://code.openark.org/blog/mysql/replace-into-think-twice – SupremeDud 2012-04-20 14:01:30

1

我總是發現它最多可靠使用兩個查詢:

$result = mysql_query("SELECT 1 FROM import_prices WHERE ..."); 
list($exists) = mysql_fetch_row($result); 

if ($exists) 
    $result = mysql_query("UPDATE import_prices ..."); 
else 
    $result = mysql_query("INSERT INTO import_prices ..."); 

這種方法的缺點是你總是會做兩個查詢而不是一個查詢。但是這種方法適用於沒有主鍵的表,如關係表。

您也可以嘗試只是在做更新查詢,然後檢查mysql_affected_rows和插入如果是0,但被警告:如果你這樣做了更新,所有的舊值都是一樣的新價值,mysql_affected_rows仍然會返回0.

相關問題