SQL插入语句中now()函数的行为及固定值实现问询
关于SQL中NOW()函数行为及固定时间插入的解决方案
问题解答
1. 插入所有行时,NOW()是否返回相同值?
在MySQL、PostgreSQL等主流数据库中,NOW()函数会在整个SQL语句执行的起始时刻计算一次,后续整个语句执行过程中,所有行的NOW()都会返回这个固定值。哪怕SELECT返回数十万行,所有行的时间值都是一致的。
2. 同一行中两次调用NOW(),是否返回相同值?
同一语句内的多次NOW()调用,都会复用语句启动时计算的那个固定时间,所以同一行里的两次NOW()结果完全相同。
实现固定时间复用的优化写法
虽然你的原始语句已经能实现所有行用同一个时间,但如果想更清晰地复用这个值(避免重复书写NOW()),可以用以下两种方式:
方式1:子查询定义固定时间
INSERT INTO table1 (col1, col2, col3, col4) SELECT ot.value1, ot.value2, fixed_time, fixed_time FROM othertable ot INNER JOIN anotherothertable aot ON ot.somecolumn = aot.someothercolumn CROSS JOIN (SELECT NOW() AS fixed_time) AS t;
方式2:CTE公共表达式(支持的数据库:MySQL 8.0+、PostgreSQL等)
WITH time_cte AS ( SELECT NOW() AS fixed_time ) INSERT INTO table1 (col1, col2, col3, col4) SELECT ot.value1, ot.value2, tc.fixed_time, tc.fixed_time FROM othertable ot INNER JOIN anotherothertable aot ON ot.somecolumn = aot.someothercolumn CROSS JOIN time_cte tc;
这两种写法都会先计算一次NOW(),再把这个值应用到所有插入行中,和原语句效果一致,但结构更清晰,也避免了重复调用函数的冗余写法。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

