在同一个查询 INSERT 中,两个 VALUES 是 NOW() 是否可以返回不同的时间?

Bre*_*bad 11 mysql query datetime mariadb-10.2

我遇到了类似的查询

INSERT INTO mytable (id, Created, Updated) VALUES (null, NOW(), NOW())
Run Code Online (Sandbox Code Playgroud)

有列定义

| Created   | datetime |
| Updated   | datetime |
Run Code Online (Sandbox Code Playgroud)

在这种情况下,MySQL 是否会将 NOW() 值设置为当前时间并向两个调用返回相同的值,或者该查询是否会运行(不太可能)风险,即 Created 和 Updated 的时间略有不同?

注意:我无法更改字段类型。

dan*_*ack 23

NOW()和其他日期时间函数返回的时间来自查询的开始时间THD这里的类用于包含连接的所有信息。该NOW()功能的实现抓住这个值,并将其返回到now_time结构。

MySQL文档NOW()也说明:

NOW() 返回一个常数时间,指示语句开始执行的时间。...

您将始终NOW()从查询中的任何位置获得相同的值。

MariaDB [test]> select now(),sleep(10),now();
+---------------------+-----------+---------------------+
| now()               | sleep(10) | now()               |
+---------------------+-----------+---------------------+
| 2021-03-22 14:17:05 |         0 | 2021-03-22 14:17:05 |
+---------------------+-----------+---------------------+
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这不是每笔交易:

MariaDB [test]> start transaction
    -> ;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]>  select now();
+---------------------+
| now()               |
+---------------------+
| 2021-03-22 14:20:53 |
+---------------------+
1 row in set (0.00 sec)

MariaDB [test]> select sleep(2);
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.00 sec)

MariaDB [test]> select now();
+---------------------+
| now()               |
+---------------------+
| 2021-03-22 14:21:00 |
+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)


Ric*_*mes 17

另一方面: SYSDATE()可以不同,但NOW()不能。

mysql> select now(6), sysdate(6), now(6), sysdate(6);
+----------------------------+----------------------------+----------------------------+----------------------------+
| now(6)                     | sysdate(6)                 | now(6)                     | sysdate(6)                 |
+----------------------------+----------------------------+----------------------------+----------------------------+
| 2021-03-21 22:02:28.983211 | 2021-03-21 22:02:28.983368 | 2021-03-21 22:02:28.983211 | 2021-03-21 22:02:28.983370 |
+----------------------------+----------------------------+----------------------------+----------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

我正在使用,(6)所以我们可以看到精确到微秒的时间。请注意NOW调用是如何相同的和最小值。同时,SYSDATE调用较晚且彼此不同。

----- 2006-03-31 5.0.20 & 尚未发布 5.1.8 -- 添加或更改功能 -- -----

向 mysqld添加了--sysdate-is-now选项,以使SYSDATE()被视为NOW()的别名。请参阅日期和时间函数。(错误#15101)

----- 2005-09-22 5.0.13 候选版本 -- 修复了错误 -- -----

SYSDATE()函数现在返回在它被调用时。特别是,在存储例程或触发器中,SYSDATE()返回它执行的时间,而不是存储例程或触发语句开始执行的时间。(错误#12480)

  • 一个模糊的实际用途:测量复制延迟。`NOW()` 值通过复制传递,而不是复制。`SYSDATE()` 在副本上重新计算。 (6认同)