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位小数的精度表示。返回的总值表示语句开始执行的时间。这就是为什么所有的值都是相同的