Postgresql 可重用的唯一行ID

Postgresql 可重用的唯一行ID,postgresql,Postgresql,我想为每一行生成32位唯一的整数id create table my_table ( uid serial primary key, some_text text ); 任何时候的行数都不会超过2147483647限制的32位有符号整数,但可以删除行并插入新行。这可能导致序列结束。因此,我希望重用已删除行的ID。最好的方法是什么?爬上我的肥皂盒。 让我们坦率地说:没有最好的方法来做到这一点,甚至没有“好的”方法。也许是最不坏的方法?有两种可能性: 创建一个表“可重用\u唯一\u

我想为每一行生成32位唯一的整数id

create table my_table (
    uid serial primary key,
    some_text text
);
任何时候的行数都不会超过2147483647限制的32位有符号整数,但可以删除行并插入新行。这可能导致序列结束。因此,我希望重用已删除行的ID。最好的方法是什么?

爬上我的肥皂盒。 让我们坦率地说:没有最好的方法来做到这一点,甚至没有“好的”方法。也许是最不坏的方法?有两种可能性:

创建一个表“可重用\u唯一\u ID”。然后,当您得到不可避免的溢出时,从中选择并删除一个值。祝你好运。 序列生成器实际上不需要无符号值。因此,创建一个在不可避免的溢出上自动包装为大负值的函数。 让我们调查一下

create sequence wrap_around_id_generator
     increment by 1
     minvalue -2147483646  
     maxvalue  2147483646   
     start     1  
     cycle  
;

create table my_table (
    uid integer default nextval('wrap_around_id_generator') primary key
  , some_text text
);
现在,当负面身份证开始出现时,你有时间准备纠正强加的身份证限制。 请提出要求不允许bigint的问题,并对其进行更改,特别是因为预计会出现整数溢出。最好的方法是改变需求,这是给出期望的唯一合理的解决方案。而且,至少在我看来,这是你的工作,不要躲在这是要求。糟糕的需求会导致糟糕的系统。总是
好的,从肥皂盒上下来

我认为最好的方法是简单地将列定义为bigint,然后忘记它。根据新插入的速率,整数也可能足够好。如果每秒消耗一个序列值,则仍需要68年的时间才能获得一个副本value@a_horse_with_no_name:抱歉,要求不允许使用bigint。在我的例子中,int溢出在合理的时间内是一种明显的可能性。那么您使用序列值的速率是多少?32位要求来自RAM限制,而不是DB存储。我将使用可重用的ids表,并将其作为单独的服务运行—解决协调问题。