【发布时间】:2011-07-28 05:12:33
【问题描述】:
假设我有长时间运行更新查询
update some_table
set modification_time = now()
where (something incredibly complex);
some_table 中的 modify_time 的值是多少?它们是相同的还是不同的(例如,执行查询需要 2 天)。
如果它们不同,我该如何编写此查询以使它们都相同?
【问题讨论】:
假设我有长时间运行更新查询
update some_table
set modification_time = now()
where (something incredibly complex);
some_table 中的 modify_time 的值是多少?它们是相同的还是不同的(例如,执行查询需要 2 天)。
如果它们不同,我该如何编写此查询以使它们都相同?
【问题讨论】:
它们都是一样的,因为 NOW() 在查询开始时被锁定。
这个答案太短了吗?
好的,更多信息MySQL reference for NOW()
NOW() 返回一个恒定时间,它指示语句开始执行的时间。 (在存储的函数或触发器中,NOW() 返回函数或触发语句开始执行的时间。)这与 SYSDATE() 的行为不同,后者返回其执行的确切时间。
不过,阅读 SYSDATE() 的手册条目实际上更有趣,其中包含这个 sn-p
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
【讨论】: