626*_*626 4 php mysql insert-update sql-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()
";
Run Code Online (Sandbox Code Playgroud)
我建议您使用特殊的 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)
Run Code Online (Sandbox Code Playgroud)
该表达式IF(a,b,c)的工作原理如下:它计算a为布尔值;IFa为 TRUE 则返回,b否则返回c。
在上面的示例中,如果active列的当前值与插入/分配的新值相同,则IF()表达式返回列的当前值updated_at。(这意味着该列的值updated_at不会更改,因为它分配的是已存储的值。)否则, 的值NOW()将分配给该updated_at列。
active我认为在对列进行分配之前检查列的当前值非常重要active。(请注意,对 的赋值updated_at出现在对 的赋值之前active。)
这是因为 MySQL 处理 SQL 中的值的方式。MySQL 不维护行的一致快照视图(“在语句的开头”)。将新值分配给列后,以后对该列的引用将返回新分配的值,而不是语句开始更改该行之前的值。
| 归档时间: |
|
| 查看次数: |
2822 次 |
| 最近记录: |