说我已经运行了很长时间的更新查询
update some_table
set modification_time = now()
where (something incredibly complex);
some_table中的modification_time值是多少?它们是相同还是不同(比如,执行查询需要2天)。
如果它们不同,我该如何编写此查询以使它们都相同?
答案 0 :(得分:8)
它们都是相同的,因为NOW()在查询开始时被锁定。
这个答案太短了吗?
好的,更多信息MySQL reference for 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 |
+---------------------+----------+---------------------+
你问的是什么有趣...... 注意你可以在查询中 SLEEP 吗?考虑这个查询(子查询只是模拟一个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