PostgreSQL гарантирует уникальные метки времени? - PullRequest
7 голосов
/ 09 августа 2010

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

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

Ответы [ 5 ]

12 голосов
/ 09 августа 2010

номер

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

2 голосов
/ 09 августа 2010

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

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

1 голос
/ 09 августа 2010

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

  SELECT ts, xmin, count(1)
  FROM foo
  GROUP BY ts, xmin
1 голос
/ 09 августа 2010

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

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

1 голос
/ 09 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...