如何创建无间隙序列?

Pie*_*ana 3 postgresql index sequence functions

观察:我在 PostgreSQL 实例中的一个表上有一个串行索引,并且我执行了一个将新记录插入到该表中的函数。函数失败(原因不重要),事务被回滚......但索引增加并且没有回滚。这会导致未使用的序列值,例如具有索引 1、2、4、5、7 等且没有删除的表。

问题:有什么办法可以回收丢失的序列值,或者防止失败的函数增加索引?

我知道有其他方法可以缓解这个潜在问题,但我仍然很好奇。

Cra*_*ger 9

这导致未使用的序列值

这是完全正常的,而且是设计使然。这也不是获得此类差距的唯一方法。请参阅手册中的注释nextval

有什么办法可以回收丢失的序列值

不。

或防止失败的函数增加序列?

不要使用SEQUENCE. 相反,如果您必须具有无缝值,请通过 使用 ID 生成表UPDATE ... RETURNING。有关更多信息,请参阅无缝序列

请注意,不可能在没有间隙的情况下进行并发插入。你得到一个或另一个。所以仔细想想你是否真的需要gapless。

对于大多数应用程序,您应该只使用SEQUENCE( SERIAL) 并针对间隙是可能且正常的事实进行设计。

  • @LPP 对于具有代理键的并发插入来说,这是一个非常基本的要求。否则,如果一次插入多个 tx,并且中间的一个(就值的数字序列而言)回滚,则您也必须回滚所有后面的。真是一团糟。这只是在一个简单的每次插入一个事务的情况下;它变得更糟。 (2认同)