一尘不染

长时间运行的查询中的SQL NOW()

sql

说我长时间运行更新查询

update some_table 
set modification_time = now() 
where (something incredibly complex);

some_table中的modification_time的值是什么?它们是相同还是不同(例如,执行查询花了2天的时间)。

如果它们不同,如​​何编写此查询以使它们都相同?


阅读 181

收藏
2021-05-23

共1个答案

一尘不染

它们都是一样的,因为NOW()在查询开始时被锁定了。

答案太短了吗?

好的,更多信息有关NOW()的MySQL参考

NOW()返回一个 恒定时间 ,该时间指示该语句 开始执行的时间
。(在存储的函数或触发器中,NOW()返回函数或触发语句开始执行的时间。)这与SYSDATE()的行为不同,后者返回确切的执行时间。

实际上,阅读SYSDATE()的手动条目实际上更有趣,它包含此代码段

mysql> SELECT NOW(), SLEEP(2), NOW();
+---------------------+----------+---------------------+
| NOW()               | SLEEP(2) | NOW()               |
+---------------------+----------+---------------------+
| 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |
+---------------------+----------+---------------------+

mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
+---------------------+----------+---------------------+
| SYSDATE()           | SLEEP(2) | SYSDATE()           |
+---------------------+----------+---------------------+
| 2006-04-12 13:47:44 |        0 | 2006-04-12 13:47:46 |
+---------------------+----------+---------------------+

您问什么有意思。.请 注意,您可以 在查询中进入 睡眠状态 ?? 考虑一下此查询(子查询仅模拟一个3记录表)

select *, now(), sleep(2), sysdate()
from (select 1 N union all select 2 union all select 3) M

你得到:

N   now()           sleep(2)  sysdate()
1   2011-04-02 23:55:27   0   2011-04-02 23:55:29
2   2011-04-02 23:55:27   0   2011-04-02 23:55:31
3   2011-04-02 23:55:27   0   2011-04-02 23:55:33
2021-05-23