Гарантирует ли PostgreSQL уникальные метки времени?

8-байтовые целые числа теперь являются значениями по умолчанию для Postgres 8.4, поэтому они допускают значения в микросекундах чтобы быть сохраненным.

Меня не особо волнует реальная точность в микросекундах (вероятно, зависит от возможностей ОС ?!) - Но гарантирует ли Postgres, что значения меток времени (вставленные current_timestamp ) всегда отличается между любыми двумя транзакциями?

7
задан Cœur 2 May 2018 в 03:02
поделиться

5 ответов

Нет.

Я провел небольшой тест, вставив current_timestamp из 5 параллельных клиентов в таблицу, 3 из 3463 записей получили одинаковую временную метку.

12
ответ дан 6 December 2019 в 11:45
поделиться

Да, точность зависит от ОС. В пределах одной транзакции временные метки все одинаковы при использовании CURRENT_TIMESTAMP, при использовании CLOCK_TIMESTAMP они могут быть разными. Разные транзакции могут иметь разные CURRENT_TIMESTAMP, это зависит от скорости вставки/обновления.

Если вам нужна уникальность, добавьте уникальное ограничение.

2
ответ дан 6 December 2019 в 11:45
поделиться

Даже если это так, кажется опасным полагаться на уникальность значений. Если вам нужен уникальный ключ, лучше использовать альтернативу, например серийный столбец.

1
ответ дан 6 December 2019 в 11:45
поделиться

К счастью, нет, поскольку это означало бы вариант «пожалуйста, сделайте это медленнее, чем должно быть».

Если вам действительно нужен серийный номер, который выглядит как временная метка, добавьте несколько микросекунд на основе результата серийного номера!

1
ответ дан 6 December 2019 в 11:45
поделиться

Я согласен с рекомендацией добавить серийный номер. Но если то, что вы пытаетесь сделать, не заслуживает изменения схемы, вы можете использовать системный столбец xmin для разделения строк с одной и той же меткой времени, но из разных транзакций.

  SELECT ts, xmin, count(1)
  FROM foo
  GROUP BY ts, xmin
1
ответ дан 6 December 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: