Postgres 8.4的8字节整数are now the default,因此它允许存储微秒值。
我不太关心真正的微秒级精度(可能取决于操作系统的功能?!) - 但Postgres保证,时间戳值(由current_timestamp
插入)在任何两个事务之间总是不同的吗?
答案 0 :(得分:12)
没有
我做了一个小测试,从表中的5个并行客户端插入current_timestamp
,3463个记录中的3个具有相同的时间戳。
答案 1 :(得分:2)
是的,精确度取决于操作系统。在单个事务中,使用CURRENT_TIMESTAMP时,时间戳都是相同的,当使用CLOCK_TIMESTAMP时,它们可能不同。不同的事务可以有不同的CURRENT_TIMESTAMPS,具体取决于您插入/更新的速度。
如果您需要唯一性,请添加唯一约束。
答案 2 :(得分:1)
即使它确实如此,依靠唯一的价值似乎也很危险。如果您需要唯一密钥,最好使用serial
列等替代方法。
答案 3 :(得分:1)
幸运的是,因为那意味着“请让它慢下来,而不是必须”选项。
如果你真的需要什么是真正的串口,但看起来像时间戳,那么根据串口的结果添加几微秒!
答案 4 :(得分:1)
我同意添加序列号的建议。但是,如果您尝试执行的操作不值得更改架构,则可以使用系统列xmin来分隔具有相同时间戳但来自不同事务的行。
SELECT ts, xmin, count(1)
FROM foo
GROUP BY ts, xmin