MySQL-通过rand()或by now()更新列时会发生什么情况?

MySQL-通过rand()或by now()更新列时会发生什么情况?,mysql,Mysql,我有一张桌子: CREATE TABLE `test` ( `t` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 并通过以下方式更新: update test set t = rand(); 那么表中的数据是: +---------------------+ | t | +---------------------+ | 0.24891147599454175 | | 0.5

我有一张桌子:

CREATE TABLE `test` (
 `t` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
并通过以下方式更新:

update test set t = rand();
那么表中的数据是:

+---------------------+
| t                   |
+---------------------+
| 0.24891147599454175 |
| 0.5710943421079725  |
| 0.10873731328988198 |
+---------------------+
正如你所看到的,每个“t”都是不同的

update test set t = SYSDATE();
使用以下命令更新表时:

update test set t = now(6);
每个“t”都是一样的:

+----------------------------+
| t                          |
+----------------------------+
| 2018-03-13 23:40:40.380817 |
| 2018-03-13 23:40:40.380817 |
| 2018-03-13 23:40:40.380817 |
+----------------------------+
按rand()或by now()更新列时会发生什么情况?

rand()
将按行重新计算。而
NOW()
在同一语句中的任何位置都是相同的值。这一切都与更新无关。它与SELECT的工作原理相同。尝试以下方法:

select rand()
from (select 1 union all select 1 union all select 1) x;

select now(6)
from (select 1 union all select 1 union all select 1) x;
你会看到同样的效果

演示:

函数
now()
返回语句开始执行的时间,并且不会为每一行调用语句,而
RAND()
则为每一行调用语句。从文件中:

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

因此,您可以使用
SYSDATE()
而不是
NOW()
。这样,每一行都会不同

update test set t = SYSDATE();

MySQL函数
rand()
now()
的文档解释了这些函数是如何工作的,所以我在这里不再重复。供参考:

使用
rand()
运行第一条语句时,会得到大于或等于0且小于1的随机浮点数。运行第二条语句时:

update test set t = now(6);
按照规定,秒值以6位小数的精度表示。返回的总值表示语句开始执行的时间。这就是为什么所有的值都是相同的