MySQL中使用RAND()或NOW()更新列时的行为差异探究
MySQL中RAND()与NOW()更新列的行为差异
嘿,咱们来把这个问题掰扯清楚——你遇到的两种更新结果,正好对应了这两个函数在MySQL里的核心行为差异:
关于NOW()的更新行为
不管你更新多少条记录,NOW()在整个UPDATE语句执行过程中只会生成一次时间戳,这个值是语句开始运行的那一刻的系统时间,然后会把这个固定值应用到所有被更新的行上。
举个实际例子:
UPDATE test_table SET t = NOW();
执行这条语句后,所有被更新的行的t字段都会是完全相同的时间,不会有任何差异。这是因为NOW()属于「语句级求值」的函数,它的值在语句启动时就被确定下来了,全程不会改变。
关于RAND()的更新行为
RAND()的情况要分两种场景:
不带参数的RAND():
这种情况下,MySQL会为每一行更新单独生成一个新的随机数——也就是「行级求值」,所以每条记录的t字段值都会不一样。比如:UPDATE test_table SET t = RAND();执行后,你会看到每行的
t都是不同的随机浮点值(范围0到1之间)。带固定种子的RAND(N):
如果你给RAND()传入一个固定的数值作为种子(比如RAND(100)),那么整个UPDATE语句会基于这个种子生成一个固定的随机序列,而所有行都会使用这个序列的第一个值。结果就是所有记录的t字段值完全一致。比如:UPDATE test_table SET t = RAND(100);不管你更新多少行,
t的值都会是同一个固定的随机数。
对应你遇到的场景
- 当每条记录
t值不同时,大概率是用了**不带参数的RAND()**做更新; - 当所有记录
t值完全一致时,要么是用了NOW(),要么是用了带固定种子的RAND(N)。
内容的提问来源于stack exchange,提问作者liangbin.hu
相关产品推荐
相关产品推荐

