代码之家  ›  专栏  ›  技术社区  ›  Austin Hyde

插入新行,更新旧行:如何?

  •  0
  • Austin Hyde  · 技术社区  · 15 年前

    我正在制作一个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。

    哦,我在用MySQL。

    只需要一个查询就可以完成吗?这似乎是一个常见的问题,一个简单的解决方案,但我就是想不出来。

    2 回复  |  直到 15 年前
        1
  •  3
  •   mfontani    15 年前

    看看MySQL的 INSERT ... ON DUPLICATE KEY ... 语法,它允许您执行以下操作: http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

    你是想在你的ORM中实现它还是在你的特定子程序中实现它取决于你。。。

        2
  •  0
  •   ircmaxell    15 年前

    如果有唯一的行标识符,则可以使用 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行的 col1 col2 4 5