【发布时间】:2021-12-24 22:22:30
【问题描述】:
我创建了一个序列列,如下所示:
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)
【问题讨论】:
-
您的假设确实不正确。但你所追求的也是不正确的。生成的主键值的唯一工作是唯一的。如果该值是
1、42、3673628、-363或其他值,则完全无关紧要。差距是预期的,没有什么可担心的。继续前进。 -
如果从表格中间删除了一行,那么后面的所有行都应该改变它们的_id吗?
-
@τεκ 此表中没有删除,只有插入和更新。
-
当一个 upsert 尝试插入时,它会调用 nextval() 消耗序列中的一个数字,即使存在冲突并且该行没有插入。
-
它是连续的,只是不是无缝的。正如所指出的那样,
serial后面的序列生成器在事务执行时不会回滚,它只是继续前进。
标签: postgresql