Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 插入新行,更新旧行:如何?_Php_Sql_Mysql - Fatal编程技术网

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

Php 插入新行,更新旧行:如何?,php,sql,mysql,Php,Sql,Mysql,我正在制作一个PHP实用程序,用于将CSV文件导入并分析到$data,以及是否将“新”行插入数据库($saveNew) 现在,我有一点难看的混乱:(在广义伪PHP中) 对我来说,这只是一种味道,我想我可以在一个查询中完成这项工作,只是我对SQL不太熟悉 我在我的应用程序中使用了一个简单的ORM,但我可以轻松地使用直接SQL 哦,我正在使用MySQL 只需一个查询就可以做到这一点吗?对于一个简单的解决方案来说,这似乎是一个常见的问题,但我就是想不出来。。。在重复键上…语法,允许您执行以下操作: 你

我正在制作一个PHP实用程序,用于将CSV文件导入并分析到
$data
,以及是否将“新”行插入数据库(
$saveNew

现在,我有一点难看的混乱:(在广义伪PHP中)

对我来说,这只是一种味道,我想我可以在一个查询中完成这项工作,只是我对SQL不太熟悉

我在我的应用程序中使用了一个简单的ORM,但我可以轻松地使用直接SQL

哦,我正在使用MySQL


只需一个查询就可以做到这一点吗?对于一个简单的解决方案来说,这似乎是一个常见的问题,但我就是想不出来。。。在重复键上…语法,允许您执行以下操作:


你是想在你的ORM中实现它,还是想在你的特定子例程中实现它取决于你……

看看MySQL的
INSERT。。。在重复键上…
语法,允许您执行以下操作:


您想在ORM中还是在您的特定子例程中实现这一点取决于您……

如果您有唯一的行标识符,可以使用以下语法:

然后,当您绑定
NULL,4,5
时,它将插入一个新行(假设
id
是一个自动递增列)


当您绑定
1,4,5
时,如果没有行1,它将插入新行,否则它将分别将行1的
col1
col2
字段更新为
4
5

如果您有唯一的行标识符,则可以使用以下语法:

然后,当您绑定
NULL,4,5
时,它将插入一个新行(假设
id
是一个自动递增列)


当您绑定
1,4,5
时,如果没有第1行,它将插入一个新行,否则它将分别将第1行的
col1
col2
字段更新为
4
5

这看起来要好得多,但这不是只有在
$saveNew
为真时才适用吗?如果我们想
同步($data,false)
,那么我们根本不想
插入
。如果存在,是否有
更新这样的事情?如果存在,则不需要
更新
。。。当您调用
UPDATE。。。当id=5时,如果id
5不存在,它就不会更新任何内容。。。没有错误,只是没有更新…@ircmaxwell:哦,哇,对我来说,这是一个“duh!”时刻。我显然没有很清楚地思考…:d这看起来好多了,但这不是只有在
$saveNew
为真时才适用吗?如果我们想
同步($data,false)
,那么我们根本不想
插入
。如果存在,是否有
更新这样的事情?如果存在,则不需要
更新
。。。当您调用
UPDATE。。。当id=5时,如果id
5不存在,它就不会更新任何内容。。。没有错误,只是没有更新…@ircmaxwell:哦,哇,对我来说,这是一个“duh!”时刻。我显然没有很清楚地思考…:D
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);
        }
     }
 }
INSERT INTO foo (id, col1, col2) VALUES (?, ?, ?) 
    ON DUPLICATE KEY UPDATE col1 = VALUES(col1), col2 = VALUES(col2);