2013-11-04 352 views
2

所以我对PostgreSQL定时函数有这个有趣的问题。PostgreSQL:CURRENT_TIMESTAMP和CLOCK_TIMESTAMP解决方案:Windows与Linux?

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

所以我的问题是这样的。为什么会发生这种情况,我该如何解决?这是我一直无法找到的一些模糊的设置吗?或者在Windows和Linux的定时器分辨率上有所不同?

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

感谢

+0

当你键入'select now():: timestamp(6);'时,在Windows上会发生什么? –

+0

@Denis 'select now():: timestamp(6);'returns'2013-11-04 15:43:08.896' –

回答

4

这个pg_hackers螺纹报价汤姆巷:

http://www.postgresql.org/message-id/[email protected]

我想你实际上问的是不是 数据类型的精度,但现在的精度()读数。你运气不好--- Windows只是没有公开一个呼叫,让挂钟时间比1毫秒更好的 。

请记住,不管Linux机器返回的结果可能是 ,这在很大程度上也是低阶位的幻想。

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

+0

啊哈,这就是答案。我认为这是某种特定操作系统。你说得对,我们可能不应该把它当作关键。我认为我们最初是这样做的,所以我们可以在日期内快速查询,但索引也可以。非常感谢! –