2011-06-03 49 views
2

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

我的问题是:有什么方法可以在主键中修复这些空白?这应该引起该列中数字的最大值,然后重置序列?

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

+3

这是正常的数据库操作 - 为什么你觉得有必要填补空白?整洁? – Oded 2011-06-03 07:38:32

+1

除非“非常高”意味着非常接近序列的最大值(这不太可能),否则您不必担心这些数字。任何数字都或多或少与其他数字一样好。 – schlenk 2011-06-03 07:43:07

+0

@Oded整洁不是一个很大的原因。事实上,在一些表格上执行了大量的添加和删除操作,这些操作在那里留下了相当大的漏洞,而且我恐怕进一步说我可能会遇到这个问题,即没有足够的数据,但仍然存在我们用完了整数空间。 – 2011-06-03 07:45:31

回答

1

如果您觉得需要填写自动生成的Posgresql序列号中的空位,我觉得您需要在表中添加另一个字段,例如某种“编号”,以编程方式增量编码,无论是在您的代码中,还是在一个触发器。

0

Postgres允许你更新PKs,尽管很多人认为这是不好的做法。所以你可以锁定表格,并且UPDATE。 (您可以用各种方法制作oldkey, newkey表,例如窗口函数。)所有FK关系都必须标记为级联。然后你可以重置id序列的currval。我个人只使用BIGSERIAL。如果你有那么很多更新和删除,即使如此,你可能会用完,也许有一些基于(比如说)一个时间戳和ID,可以帮助你的复合PK。

1

可以解决这个问题,但数据库要做的事情(特别是IO)是昂贵的,并且保证会再次发生。我不会担心这个问题。如果您接近4B,请将主密钥和外键升级至BIGSERIALBIGINT。如果您接近2^64 ...呃...我有兴趣了解更多关于您的应用程序的信息。 :〜]