2012-04-20 3 views
1

私が知りたかったのはで、データが存在する場合はmysql update query elseデータをmysqlテーブルに挿入する必要があります。データが存在する場合は更新クエリを実行する方法、それ以外の場合はデータをMysqlに挿入する方法はありますか?

私が行ったことは、fgetcsv()機能を使用して.csvファイルからmysqlにデータをフェッチしています。 次に、csv &から各行を読み、これらの4つの値を4つの変数&に入れ、更新クエリを実行します。 なので、データが存在しない場合でも、更新クエリが機能している(0行が正常に更新された)ので、そのデータを識別するにはどうすればいいですか?& 作業。

product_entity_priceテーブルにデータを更新または挿入したいとします。 マイscript-:

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

+0

あなたの 'import_prices'テーブルにユニークなキーがありますか? – Travesty3

+0

HI CodeCaster、INSERT INTO ... INSERT INTO ...重複しているKEY UPDATEはうまくいきます...しかし、別のテーブルproduct_entity_priceに更新または挿入したい...&ユニークキーまたはプライマリキーのような制約で重複キー更新を使用します。 .. product_entity_priceにはユニークなキーはありません... – Prat

答えて

1

私が何をしたいことはそうINSERT...ON DUPLICATE KEY UPDATEとして知られているMySQLのUPSERT、だと思います。

+1

それはすでに彼のコードに入っています – SupremeDud

+0

それはまだ正しい答えです。キーの調査は貴重です。 –

1

あなたが行が重複した場合は削除して、再度挿入しますならば、あなたは置き換えるREPLACE

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

挿入/更新する行が多い場合は、これに注意してください。 http://code.openark.org/blog/mysql/replace-into-think-twice – SupremeDud

1

を私は常にそれを見つけましたの2つのクエリを使用する場合:

$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 ..."); 

このアプローチの欠点は、常に1つではなく2つのクエリを作成することです。しかし、このアプローチは、リレーショナル表のような主キーを持たない表に対しても機能します。

また、単に更新クエリを実行し、その後mysql_affected_rowsをチェックし、それが0である場合に挿入しようとすることができますが、を警告さ:あなたはアップデートを行うと、古い値のすべてが新しい値と同じであれば、mysql_affected_rowsそれでも0を返すでしょう。

関連する問題