假设我有一个长时间运行的更新查询。
update some_table
set modification_time = now()
where (something incredibly complex);
some_table中的modification_time值会是什么?它们会相同还是不同(比如,查询花费了2天的时间)。
如果它们不同,我该如何编写查询使它们都相同?
这些值都将相同,因为NOW()被锁定在查询开始时的时间。
这个回答太简短了吗?
好的,更多信息请参考MySQL对NOW()的参考文档
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