2010-07-30 3 views
0

Я делаю утилиту PHP, которая импортирует и анализирует CSV-файл в $data, и нужно ли INSERT «новые» строки в базе данных ($saveNew).INSERT новые строки, UPDATE старые строки: как?

Прямо сейчас, у меня есть немного уродливым беспорядок: (в обобщенном псевдо-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

Посмотрите INSERT ... ON DUPLICATE KEY ... синтаксис MySQL, который позволяет сделать только что: http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

Если вы хотите, чтобы осуществить это в вашем ОРМ или в этой конкретной подпрограммы твоего до вас ...

+0

Это выглядит гораздо лучше, но разве это не будет применяться, только если '$ saveNew' является истинным? Если мы хотим «синхронизировать ($ data, false)», то мы вообще не хотим «INSERT». Есть ли такая вещь, как 'UPDATE IF EXISTS'? –

+0

Нет необходимости в 'UPDATE IF EXISTS' ... когда вы вызываете' UPDATE ... WHERE id = 5', если id '5' не существует, он просто ничего не обновит ... Нет ошибки , просто никаких обновлений ... – ircmaxell

+0

@ircmaxwell: О, ничего себе, поговорим о «духе!» момент для меня. Я, по-видимому, не думаю очень прямо ...: D –

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 в col1 и col2 поля 4 и 5 соответственно ...