仅更新ON DUPLICATE KEY UPDATE的更改值

时间:2014-05-06 22:07:23

标签: php mysql sql-update insert-update

我有一个复选框列表,这些复选框被赋值为1或0,所有这些都在$ _POST变量中传递。

我当前的sql语句正确地插入了所有这些语句,但是当我更改一个值并再次运行sql语句时,它会更新所有项目的“updated_at”列。

有没有办法只更新更改的值,因此它不会为每个条目更新“updated_at”列? id是我的主键,site_id是唯一的。

SQL语句:

        $sql = "INSERT INTO admin_sites2 (site_id,created_at,active)
                VALUES ('$key',now(),'$value')
                ON DUPLICATE KEY
                UPDATE active = $value,
                updated_at = now()
               ";

2 个答案:

答案 0 :(得分:3)

我建议你使用特殊的VALUES()函数来引用插入到列中的值(如果插入成功的话)。

您可以使用一个表达式,将列的当前值与新提供的值进行比较,并有条件地返回列的当前值或新表达式。

例如:

            INSERT INTO admin_sites2 (site_id,created_at,active)
            VALUES ('$key',now(),'$value')
            ON DUPLICATE KEY
            UPDATE updated_at = IF(active=VALUES(active),updated_at,NOW()),
            active = VALUES(active)

表达式 IF(a,b,c) 的工作原理如下:它将a计算为布尔值;如果a为TRUE,则返回b,否则返回c

在上面的示例中,如果active列的当前值与插入/分配的新值相同,则IF()表达式将返回updated_at的当前值柱。 (这意味着updated_at列的值不会被更改,因为它会分配已存储的值。)否则,NOW()的值将被分配到updated_at列。

我认为在对active列进行分配之前检查active列的当前值非常重要。 (请注意,updated_at的分配在active的分配之前出现。)

这是因为MySQL在SQL中处理值的方式。 MySQL没有维护行的一致快照视图('在语句的开头')。为列分配新值后,稍后对该列的引用将返回新分配的值,而不是在语句开始更改行之前的值。

答案 1 :(得分:0)

虽然我确信这可以在一个查询中完成,但为什么不进行多次查询呢?只需选择active列,其中site_id等于$ key。如果没有结果,请执行插入并设置updated_at。如果存在且值不同,请更新两列。否则什么都不做