Postgresql

如何創建無間隙序列?

  • January 19, 2018

**觀察:**我在 PostgreSQL 實例中的表上有一個序列索引,我執行了一個函式,將一條新記錄插入到該表中。函式失敗(原因不重要),事務被回滾……但索引增加並且沒有回滾。這會導致未使用的序列值,例如索引為 1、2、4、5、7 等的表,沒有刪除。

**問題:**有什麼方法可以回收失去的序列值,或者防止失敗的函式增加索引?

我知道有其他方法可以緩解這個潛在問題,但我仍然很好奇。

這會導致未使用的序列值

這是完全正常的,而且是設計使然。這也不是獲得這種差距的唯一方法。請參閱手冊中的註釋nextval

有沒有辦法回收失去的序列值

不。

或防止失敗的功能增加序列?

不要使用SEQUENCE. 相反,如果您必須有無間隙值,請使用 ID 生成表通過UPDATE ... RETURNING. 有關更多資訊,請參閱無間隙序列

請注意,不可能有沒有可能間隙的並發插入。你得到一個或另一個。因此,請認真考慮您是否真的需要無縫。

對於大多數應用程序,您應該只使用SEQUENCE( SERIAL) 並設計為間隙是可能的和正常的事實。

引用自:https://dba.stackexchange.com/questions/119784