我有一个 postgres 数据库,它广泛使用序列来生成表的主键。 经过大量使用该数据库(即添加/更新/删除操作)后,使用序列作为主键的列现在有很多漏洞/间隙,并且序列值本身非常高。
我的问题是:有什么方法可以修复主键中的这些空白吗?这应该依次降低这些prim列中数字的最大值,然后重置序列?
注意:其中许多列也被其他列作为外键引用。
如果您觉得需要填补自动生成的 Posgresql 序列号中的空白,我感觉您需要在表中添加另一个字段,例如您以编程方式增加的某种“数字”,无论是在代码中还是在触发器中。
这个问题是可以解决的,但是对于数据库来说(尤其是IO)成本很高,而且肯定会再次发生。我不会担心这个问题。如果您接近 4B,请将主键和外键升级为
BIGSERIAL
和 BIGINT
。如果您接近 2^64...那么...我有兴趣了解有关您的应用程序的更多信息。 :~]
Postgres 允许您更新 PK,尽管很多人认为这是不好的做法。所以你可以锁定桌子,然后
UPDATE
。 (您可以通过各种方式制作 oldkey, newkey
表,例如窗口函数。)所有 FK 关系都必须标记为级联。然后你可以重置id序列的currval。
就我个人而言,我只会使用
BIGSERIAL
。如果您有这么多很多更新和删除,即使如此,您也可能会用完,也许有一些基于(例如)时间戳和ID的复合PK可以帮助您。