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