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

Rad*_*ris 80 mysql sql-update

我需要更新2个datetime列,我需要它们使用mysql 4.1.20版完全相同.我正在使用此查询:

mysql> update table set last_update=now(), last_monitor=now() where id=1;
Run Code Online (Sandbox Code Playgroud)

它是安全的,或者有可能在不同的时间更新列,因为有2个可见的调用now()
我不认为它可以与不同的值(我认为内部MySQL调用更新now()每行或类似的东西只有一次),但我不是专家,你觉得呢?

第二个问题为什么此查询不更新列:

mysql> update table set last_update=now(), last_monitor=now() where id=1;
Run Code Online (Sandbox Code Playgroud)

Rad*_*ris 134

找到了解决方案:

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;
Run Code Online (Sandbox Code Playgroud)

我在MySQL Docs中找到了这个,经过一些测试后它可以工作:

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

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

关于第二个问题,没有任何答案,没有找到关于这个的mysql文档.


小智 7

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

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


Ric*_*ews 5

当语句开始执行时,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)
Run Code Online (Sandbox Code Playgroud)