8-байтовые целые числа теперь являются значениями по умолчанию для Postgres 8.4, поэтому они допускают значения в микросекундах чтобы быть сохраненным.
Меня не особо волнует реальная точность в микросекундах (вероятно, зависит от возможностей ОС ?!) - Но гарантирует ли Postgres, что значения меток времени (вставленные current_timestamp
) всегда отличается между любыми двумя транзакциями?
Нет.
Я провел небольшой тест, вставив current_timestamp
из 5 параллельных клиентов в таблицу, 3 из 3463 записей получили одинаковую временную метку.
Да, точность зависит от ОС. В пределах одной транзакции временные метки все одинаковы при использовании CURRENT_TIMESTAMP, при использовании CLOCK_TIMESTAMP они могут быть разными. Разные транзакции могут иметь разные CURRENT_TIMESTAMP, это зависит от скорости вставки/обновления.
Если вам нужна уникальность, добавьте уникальное ограничение.
Даже если это так, кажется опасным полагаться на уникальность значений. Если вам нужен уникальный ключ, лучше использовать альтернативу, например серийный
столбец.
К счастью, нет, поскольку это означало бы вариант «пожалуйста, сделайте это медленнее, чем должно быть».
Если вам действительно нужен серийный номер, который выглядит как временная метка, добавьте несколько микросекунд на основе результата серийного номера!
Я согласен с рекомендацией добавить серийный номер. Но если то, что вы пытаетесь сделать, не заслуживает изменения схемы, вы можете использовать системный столбец xmin для разделения строк с одной и той же меткой времени, но из разных транзакций.
SELECT ts, xmin, count(1)
FROM foo
GROUP BY ts, xmin