You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:17:22