使postgresql时间戳唯一

时间:2016-01-20 08:17:30

标签: postgresql

我有一个包含6M +行的数据集,包括从2003年到当前的时间戳。 2014年,数据库迁移到postgresql,由于时间戳的精度更高,时间戳列变得独一无二。原始ID列未迁移。大约300k的时间戳至少重复一次。我想修改timestamp列,使它们通过添加精度是唯一的(所有非唯一时间戳只到第二个)。

我有这个

ts                    message
--------------------|---------------
2014-02-01 07:40:37 | message1
2014-02-01 07:40:37 | message2

我想要这个

ts                         message
-------------------------|---------------
2014-02-01 07:40:37.0000 | message1
2014-02-01 07:40:37.0001 | message2

2 个答案:

答案 0 :(得分:0)

这应该可行,但我想这会非常慢:

update the_table
  set ts = ts + '1 millisecond'::interval * x.rn
from (
   select ctid, row_number() over (order by ts) as rn
   from the_table
) x
where the_table.ctid = x.ctid;

ctid是Postgres维护的internal unique identifier(实际上是行的物理地址)。

您可能希望添加另一个where条件,以仅选择需要修改的行。

答案 1 :(得分:0)

一个简单的解决方案是尝试在时间戳中添加随机区间:

update t
set ts = ts + random() * interval '1000000 microsecond'
where ts = date_trunc('second', ts)

碰撞的可能性非常低。如果发生,请使用@a_horse's answer