我创建了一个串行列,如下所示:
CREATE TABLE public.table_name (
"_id" serial4 NOT NULL,
我的假设是,该列仅包含连续值,即 1, 2, ..., n
,其中 n
- 是总数表 table_name
中的行数。然而,事实并非如此:
SELECT max(_id), count(*) FROM public.table_name;
产量:
959132 111933
我知道我的假设很可能是错误的,但是您能否告诉我实现我所追求的目标的正确方法,以及最好如何更新已经不连续的值以使它们连续。
Postgres 版本:
PostgreSQL 13.2 (Ubuntu 13.2-1.pgdg18.04+1)
最佳答案
这很正常。序列出现间隙如果
您调用
nextval()
但不使用该值您调用
nextval()
并使用INSERT
中的值,但事务失败并回滚数据库崩溃
您创建的序列的
CACHE
大于 1,并关闭了数据库 session
人们常常想要一个“无间隙序列”,但大多数时候这并不是真正必要的。如果您使用特殊的计数器表,每当您需要下一个值时都会更新
,但是这会序列化所有需要值的事务。
没有办法在不严重影响性能的情况下获得无间隙序列。
您可以在我的 article on that topic 中找到更多详细信息.
关于postgresql - 串行类型列值获取非连续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69945126/