2010-07-30 147 views
0

我正在製作一個PHP實用程序,用於將CSV文件導入並分析爲$data以及是否向數據庫中插入「新」行($saveNew)。插入新行,更新舊行:如何?

現在,我有一個有點醜陋的爛攤子:(廣義僞PHP)

function synchronize($data,$saveNew) { 
    $existing_ids = $table->find_all('ID'); //array of ID's in the table 
    $incoming_ids = get_key('ID',$data); //grabs the ID field from each record 
    $new_ids = array_diff($incoming_ids,$existing_ids); 

    foreach ($data as $record) { 
     if (in_array($record['ID'],$new_ids)) { //it's new 
      if ($saveNew) $table->insert($record); 
      else continue; 
     } else { 
      $table->update($record); 
     } 
    } 
} 

對我來說,這只是有一個氣味,我想我可以在短短一個做到這一點查詢,除了我不熟悉SQL。

我在我的應用程序中使用了一個簡單的ORM,但我可以輕鬆地使用直接的SQL。

哦,我正在使用MySQL。

這可以只用一個查詢來完成嗎?這似乎是一個簡單的解決方案的常見問題,但我無法弄清楚。

回答

3

看一看MySQL的INSERT ... ON DUPLICATE KEY ...語法,它可以讓你做到這一點:http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

無論你是想實現在你的ORM或在你的特定子程序是你的...

+0

這看起來多少更好,但是這不僅僅適用於'$ saveNew'爲真的情況嗎?如果我們想'同步($ data,false)',那麼我們根本不想'插入'。有沒有更新IF EXISTS這樣的東西? – 2010-07-30 15:08:18

+0

當你調用'UPDATE ... WHERE id = 5'時,不需要'UPDATE IF EXISTS' ...如果id不存在'5',它就不會更新任何東西......沒有錯誤,只是沒有更新... – ircmaxell 2010-07-30 15:16:48

+0

@ircmaxwell:哦,哇,談論一個「呃!」我的時刻。我顯然不是很直白......:D – 2010-07-30 15:21:06

0

如果你有一個唯一行標識符,您可以使用INSERT ... ON DUPLICATE KEY UPDATE語法:

INSERT INTO foo (id, col1, col2) VALUES (?, ?, ?) 
    ON DUPLICATE KEY UPDATE col1 = VALUES(col1), col2 = VALUES(col2); 

然後,當你綁定NULL, 4, 5它會插入新行(假設id是一個utoincrement列)

當您綁定1, 4, 5它會插入新行,如果沒有第1行,否則它會更新1行的col1col2領域45分別...