postgresql - 串行类型列值获取非连续值

标签 postgresql

我创建了一个串行列,如下所示:

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/

相关文章:

java - FreeMarker 中日期的默认值

postgresql - 从整数列中获取子字符串

sql - 如何在 select 子句中使用 union?

.net - 具有多个语句的 Npgsql 命令

arrays - JSON 的 Postgres 数组避免强制转换

arrays - 修复插入不当的 Postgres 数组

postgresql - Heroku PostgreSQL - 如何在没有证书的情况下发生 SSL 连接?

php - 为什么对 PostgreSQL(在 PHP 上)的查询返回一个字符串数组而不是一个关联数组?

SQL Postgres 使引用无效 ID 的行无效

json - Golang JSON Marshal/Unmarshal postgres now()