Postgresql
如何創建無間隙序列?
**觀察:**我在 PostgreSQL 實例中的表上有一個序列索引,我執行了一個函式,將一條新記錄插入到該表中。函式失敗(原因不重要),事務被回滾……但索引增加並且沒有回滾。這會導致未使用的序列值,例如索引為 1、2、4、5、7 等的表,沒有刪除。
**問題:**有什麼方法可以回收失去的序列值,或者防止失敗的函式增加索引?
我知道有其他方法可以緩解這個潛在問題,但我仍然很好奇。
這會導致未使用的序列值
這是完全正常的,而且是設計使然。這也不是獲得這種差距的唯一方法。請參閱手冊中的註釋
nextval
。有沒有辦法回收失去的序列值
不。
或防止失敗的功能增加序列?
不要使用
SEQUENCE
. 相反,如果您必須有無間隙值,請使用 ID 生成表通過UPDATE ... RETURNING
. 有關更多資訊,請參閱無間隙序列。請注意,不可能有沒有可能間隙的並發插入。你得到一個或另一個。因此,請認真考慮您是否真的需要無縫。
對於大多數應用程序,您應該只使用
SEQUENCE
(SERIAL
) 並設計為間隙是可能的和正常的事實。