INSERT新行,UPDATE旧行:怎么做?

时间:2010-07-30 14:48:25

标签: php sql mysql

我正在创建一个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。

这可以通过一个查询完成吗?看起来这是一个简单解决方案的常见问题,但我无法弄明白。

2 个答案:

答案 0 :(得分:3)

查看MySQL的INSERT ... ON DUPLICATE KEY ...语法,它允许您这样做:http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

您是想在ORM中实现该功能还是在您的特定子程序中实现该功能取决于您...

答案 1 :(得分: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是一个自动增量列)

绑定1, 4, 5时,如果没有第1行,则会插入新行,否则会将第1行的col1col2字段更新为45分别......