Подтвердить что ты не робот

Now() значения по умолчанию показывают одну и ту же метку времени

Я создал таблицы со столбцом (тип: timestamp с часовым поясом) и установил значение по умолчанию now() (current_timestamp()).

Я запускаю ряд вставок в отдельных операторах в одной функции, и я заметил, что все временные метки равны (ms), является ли значение функции каким-то кэшированием и общим для всего вызова функции или транзакции?

4b9b3361

Ответ 1

Это ожидаемое и документированное поведение:

Из руководства:

Так как эти функции возвращают время начала текущей транзакции, их значения не изменяются во время транзакции. Это считается особенностью: цель состоит в том, чтобы позволить единой транзакции иметь последовательное представление о "текущем" времени, так что несколько модификаций внутри одной транзакции имеют одинаковый штамп времени.

Если вы хотите что-то, что меняется каждый раз при запуске инструкции, вам нужно использовать statement_timestamp() или даже clock_timestamp() (снова см. описание в руководстве)

Ответ 2

now() или current_timestamp являются STABLE функции, возвращающие метку времени при начале транзакции.

Рассмотрим один из других параметров, предлагаемых PostgreSQL, в частности statement_timestamp().
В документации:

statement_timestamp() возвращает время начала текущего оператора (точнее, время получения последнего сообщения команды от клиента)