0

now()为什么在横向连接中包装函数时我可以看到相同的时间戳。

我制定了一个代码示例来举例说明:

SELECT *
FROM generate_series(1, 10000)
       LEFT JOIN LATERAL (
  SELECT now() AS now
  ) sub ON TRUE

结果相同的时间戳,例如(修剪):

1, 2020-07-22 08:48:55.038668
2, 2020-07-22 08:48:55.038668
3, 2020-07-22 08:48:55.038668
4, 2020-07-22 08:48:55.038668

我本来希望每一行都包含一个新的时间戳(按递增顺序),因为 LATERAL 是逐行执行的。

4

1 回答 1

2

这是记录在案的行为(强调我的):

由于这些函数返回当前事务的开始时间,因此它们的值在事务期间不会改变。这被认为是一个特性:目的是允许单个事务具有一致的“当前”时间概念,以便同一事务中的多个修改具有相同的时间戳。

这里的目的是保证给定事务中函数返回的值的一致性。

如果您需要为每一行更改的内容,请使用clock_timestamp()

于 2020-07-22T08:53:06.223 回答