mysql使用相同的now()更新多个列

时间:2010-09-27 08:47:58

标签: mysql sql-update

我需要更新2个日期时间列,并且我需要它们使用mysql 4.1.20版完全相同。我正在使用此查询:

mysql> update table set last_update=now(), last_monitor=now() where id=1;

这是安全的,或者由于对now()的2次可见调用,列可能会在不同时间更新? 我不认为它可以用不同的值更新(我认为内部mysql调用now()每行一次或类似的东西),但我不是专家,您怎么看?

更新 第二个问题被提取here

7 个答案:

答案 0 :(得分:128)

找到解决方案:

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;

我在MySQL Docs中找到了this,经过一些测试后它可以运行:

  

以下语句将col2设置为当前(更新的)col1值,而不是原始col1值。结果是col1和col2   具有相同的价值。此行为与标准SQL不同。

     

UPDATE t1 SET col1 = col1 + 1,col2 = col1;

答案 1 :(得分:7)

Mysql不是很聪明。如果要在多个更新或插入查询中使用相同的时间戳,则需要声明变量。

当您使用now()功能时,每次在另一个查询中调用时,系统都会调用当前时间戳。

答案 2 :(得分:1)

您可以在运行更新查询之前将now()的值存储在变量中,然后使用该变量更新字段last_updatelast_monitor

这将确保now()仅执行一次,并且在您需要的两列上更新相同的值。

答案 3 :(得分:1)

您可以将以下代码放在timestamp列的默认值上: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,所以在更新时,两列的值相同。

答案 4 :(得分:1)

当语句开始执行时,MySQL对每个语句评估一次now()。因此,每个语句有多个可见的now()调用是安全的。

select now(); select now(), sleep(10), now(); select now();
+---------------------+
| now()               |
+---------------------+
| 2018-11-05 16:54:00 |
+---------------------+
1 row in set (0.00 sec)

+---------------------+-----------+---------------------+
| now()               | sleep(10) | now()               |
+---------------------+-----------+---------------------+
| 2018-11-05 16:54:00 |         0 | 2018-11-05 16:54:00 |
+---------------------+-----------+---------------------+
1 row in set (10.00 sec)

+---------------------+
| now()               |
+---------------------+
| 2018-11-05 16:54:10 |
+---------------------+
1 row in set (0.00 sec)

答案 5 :(得分:0)

如果您确实需要确保now()具有相同的值,则可以运行两个查询(这也将回答您的第二个问题,在这种情况下,您要求update last_monitor = to last_update但{{{} 1}}尚未更新)

你可以做点什么:

last_update

无论如何,我认为mysql足够聪明,每次查询只需要mysql> update table set last_update=now() where id=1; mysql> update table set last_monitor = last_update where id=1; 一次。

答案 6 :(得分:0)

有2种方法;

首先 ,我建议您在将now()声明为变量之前,将其注入sql语句。可以说;

var x = now();
mysql> UPDATE table SET last_update=$x, last_monitor=$x WHERE id=1;

从逻辑上讲,如果您希望为last_monitor输入不同的输入,则将添加另一个变量;例如

var y = time();
mysql> UPDATE table SET last_update=$x, last_monitor=$y WHERE id=1;

这样,您不仅可以在mysql语句中,而且可以在您的项目中使用的服务器端脚本语言(如PHP)中,尽可能多地使用变量。 请记住,可以将这些相同的变量作为输入插入到应用程序前端的表单中。这使项目变得动态而不是静态。

其次 ,如果now()指示更新时间,则可以使用mysql删除该行的属性作为时间戳。每次插入一行或更新时间也都会更新。