2010-07-30 99 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分别...