Sql 修复Postgres序列生成的数字中的孔/间隙

Sql 修复Postgres序列生成的数字中的孔/间隙,sql,postgresql,sequences,Sql,Postgresql,Sequences,我有一个postgres数据库,它广泛使用序列来生成表的主键。 在大量使用该数据库(即添加/更新/删除操作)后,使用序列作为主键的列现在有很多孔/间隙,并且序列值本身非常高 我的问题是:有什么方法可以修复主键中的这些缺口吗?哪一项应该降低该列中数字的最大值,然后重置序列 注意:这些列中的许多列也被其他列引用为外键。如果您觉得有必要填补自动生成的Posgresql序列号中的空白,我觉得您需要在表中添加另一个字段,例如在代码中以编程方式递增的某种“数字”,或者在触发器中。Postgres允许您更新P

我有一个postgres数据库,它广泛使用序列来生成表的主键。 在大量使用该数据库(即添加/更新/删除操作)后,使用序列作为主键的列现在有很多孔/间隙,并且序列值本身非常高

我的问题是:有什么方法可以修复主键中的这些缺口吗?哪一项应该降低该列中数字的最大值,然后重置序列


注意:这些列中的许多列也被其他列引用为外键。

如果您觉得有必要填补自动生成的Posgresql序列号中的空白,我觉得您需要在表中添加另一个字段,例如在代码中以编程方式递增的某种“数字”,或者在触发器中。

Postgres允许您更新PKs,尽管很多人认为这是一种不好的做法。因此,您可以锁定表,并
UPDATE
。(您可以通过各种方式制作
oldkey、newkey
表,例如窗口函数)。所有FK关系都必须标记为级联。然后可以重置id序列的currval


就个人而言,我只会使用
BIGSERIAL
。如果您有太多的更新和删除,甚至可能会耗尽,那么可能会有一些基于(比如)时间戳和id的复合PK来帮助您。

解决这个问题是可能的,但数据库的成本很高(尤其是IO),而且保证会再次发生。我不会担心这个问题。如果接近4B,请将主键和外键升级到
BIGSERIAL
BIGINT
。如果您正接近2^64。。。好。。。我很想了解更多关于你申请的情况。:~]

这是正常的数据库操作-为什么您觉得需要填补这些空白?整洁度?除非“非常高”表示非常接近序列的最大值(这不太可能),否则您不必担心这些数字。任何数字或多或少都和其他数字一样好。@Oded整洁并不是一个很大的原因。事实上,在某些表上执行了大量的添加和删除操作,这些操作留下了相当大的漏洞,我担心再进一步,我可能会遇到问题,即数据不足,但我们的整数空间仍然不足。@Clodoaldo如果我能填补空白,不需要使用bigint。事实是,在任何时候,这些表中都没有那么多数据。只有由于大量的insert&delete操作,Int列才能在很长的时间内运行和删除。我仍在计算这些持续时间。如果有什么东西可以通过更新ID来填补这些漏洞,那么根据计算出来的时间,它只能每季度或每半年使用一次。