3

所以我对 PostgreSQL 计时函数有一个有趣的问题。

这是情况。我们有一个预生产服务器 (Linux),用于存放我们正在开发的应用程序。我还在该数据库(Windows)的本地副本上做一些工作,以防服务器正在进行一些更重要的工作。我最近遇到了一个问题,我开始在本地数据库副本的日志表上发现主键违规。我认为这是不可能的,因为我使用 CLOCK_TIMESTAMP(当前系统时间)作为主键。此外,我在 pre-prod 服务器上进行了测试,它运行良好。所以我做了一些调查。我最终发现,如果我在服务器上运行“SELECT CLOCK_TIMESTAMP()”,它会将时间返回到微秒。如果我在本地主机上运行它,它只会下降到毫秒。因此,当在计时器到达下一毫秒之前发生多个更新时,就会出现问题,

所以我的问题是这个。为什么会发生这种情况,我该如何解决?这是我还没有找到的一些晦涩的设置吗?还是 Windows 与 Linux 的计时器分辨率不同?

编辑:CURRENT_TIMESTAMP、NOW() 和所有其他返回时间戳的内置函数也会发生同样的事情。

谢谢

4

1 回答 1

4

在这个 pg_hackers 线程上引用 Tom Lane 的话:

http://www.postgresql.org/message-id/9699.1262011789@sss.pgh.pa.us

我想您真正要问的不是数据类型的精度,而是 now() 读数的精度。你不走运 --- Windows 只是没有公开调用以使挂钟时间优于 1 毫秒。

请记住,无论 Linux 机器返回什么,在低位也可能在很大程度上是幻想。

要解决您的问题,请考虑使用序列号作为主键。(当然,假设您实际上首先需要日志文件的主键。)

于 2013-11-04T20:53:59.263 回答