2011-06-03 46 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 ...呃...我有興趣瞭解更多關於您的應用程序的信息。 :〜]