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