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

时间:2011-06-03 07:35:22

标签: sql postgresql sequences

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

我的问题是:我们有什么方法可以解决主键中的这些差距?应该是什么来降低该列中数字的最大值,然后重置序列?

注意:很多这些列也被其他列引用为ForeignKeys。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

有可能解决这个问题,但数据库的成本很高(尤其是IO)并且保证会再次发生。我不担心这个问题。如果您接近4B,请将主密钥和外键升级到BIGSERIALBIGINT。如果你接近2 ^ 64 ......那么......我有兴趣了解更多关于你的申请。 :〜]

答案 2 :(得分:0)

Postgres允许你更新PK,虽然很多人认为这是不好的做法。所以你可以锁定表格UPDATE。 (您可以通过各种方式创建oldkey, newkey表,例如窗口函数。)所有FK关系都必须标记为级联。然后你可以重置id序列的currval。

就个人而言,我只会使用BIGSERIAL。如果您有所以许多更新和删除,即使如此,也许有一些复合PK基于(比方说)时间戳和ID,可以帮助您。