Now() значения по умолчанию показывают одну и ту же метку времени
Я создал таблицы со столбцом (тип: timestamp с часовым поясом) и установил значение по умолчанию now()
(current_timestamp()
).
Я запускаю ряд вставок в отдельных операторах в одной функции, и я заметил, что все временные метки равны (ms), является ли значение функции каким-то кэшированием и общим для всего вызова функции или транзакции?
Ответы
Ответ 1
Это ожидаемое и документированное поведение:
Из руководства:
Так как эти функции возвращают время начала текущей транзакции, их значения не изменяются во время транзакции. Это считается особенностью: цель состоит в том, чтобы позволить единой транзакции иметь последовательное представление о "текущем" времени, так что несколько модификаций внутри одной транзакции имеют одинаковый штамп времени.
Если вы хотите что-то, что меняется каждый раз при запуске инструкции, вам нужно использовать statement_timestamp()
или даже clock_timestamp()
(снова см. описание в руководстве)
Ответ 2
now()
или current_timestamp
являются STABLE
функции, возвращающие метку времени при начале транзакции.
Рассмотрим один из других параметров, предлагаемых PostgreSQL, в частности statement_timestamp()
.
В документации:
statement_timestamp()
возвращает время начала текущего оператора (точнее, время получения последнего сообщения команды от клиента)