我有一个复选框列表,这些复选框被赋值为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()
";
答案 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
。如果存在且值不同,请更新两列。否则什么都不做