首页 > 解决方案 > postgres 没有正确增加我的串行数据类型的 id

问题描述

我的数据库中有 500 条记录,当我删除 id =5 然后尝试重新插入相同的记录时,它没有正确更新序列。它在 id = 505 但我的最大 id 为 500 的位置插入新记录。我还使用以下查询更新事务前后的排序:SELECT setval(pg_get_serial_sequence('table_name', 'id'), max(id)) FROM表名;

尽管如此,它仍在不正确地增加序列。

id bigserial 主键 NOT NULL

任何帮助将不胜感激。谢谢

标签: pythonpostgresql

解决方案


删除作为序列已用于填充列的行不会更新序列。

如果您需要无间隙订购号,则不能使用序列。

请参阅https://www.postgresql.org/docs/9.5/sql-createsequence.html其中说:

因为 nextval 和 setval 调用永远不会回滚,如果需要“无缝”分配序列号,则不能使用序列对象。可以通过使用包含计数器的表的排他锁定来构建无间隙分配;但是这种解决方案比序列对象要昂贵得多,尤其是在许多事务同时需要序列号的情况下。


推荐阅读