Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

PostgreSQL 查看某个自增字段(序列)当前最新值

PostgreSQL 中,查看「某个自增字段(序列)」当前最新值,要分清 序列是否已被使用过。下面按 最常用 -> 最严谨 -> 最安全 总结。

一、最常用:直接查序列 last_value(⚠️注意含义)

SELECT last_value FROM articles_id_seq;

含义

  • 不是一定等于表中最大 id
  • 表示:序列当前内部值
  • 如果:
    • 从未 nextval() -> 可能是起始值
    • 有回滚事务 -> 可能大于表中最大 id

👉 只能说明序列状态,不代表数据真实最大值

二、查看下一个将要使用的值(最准确)

SELECT nextval('articles_id_seq');

⚠️ 会递增序列(慎用)

三、只读方式查看“下一个值”(不递增)

PostgreSQL 10+(推荐)

SELECT
    last_value,
    increment_by
FROM
    pg_sequences
WHERE
    schemaname = 'public'
    AND sequencename = 'articles_id_seq';

👉 下一个值:

last_value + increment_by

四、查询表中真实最大 id(与序列对比)

SELECT MAX(id) FROM articles;

📌 常见用途:

  • 数据导入后检查序列是否错位
  • 判断是否需要 setval

五、修复序列错位(非常常见)

如果你发现:

MAX(id) = 1000
last_value = 900

修复:

SELECT setval('articles_id_seq', (SELECT MAX(id) FROM articles));

或(更严谨):

SELECT setval(
    'articles_id_seq',
    (SELECT MAX(id) FROM articles),
    true
);

六、IDENTITY 列的正确查看方式(PG 10+)

如果你的表是:

id INTEGER GENERATED ALWAYS AS IDENTITY

找到序列名:

SELECT pg_get_serial_sequence('articles', 'id');

然后:

SELECT last_value FROM articles_id_seq;

七、其它

Q:如何查看自增字段当前值?

SELECT last_value FROM xxx_id_seq;

Q:为什么不等于 MAX(id)?

A:序列不回滚,事务失败也会消耗值。

Q:安全查看方式?

A:查询 pg_sequences,不使用 nextval()。

八、常见误区(⚠️)

  • ❌ 用 nextval() 当查看
  • ❌ 认为序列值一定连续
  • ❌ 忘记导入数据后同步序列

最推荐日常用的 2 条

-- 查看序列
SELECT pg_get_serial_sequence('articles', 'id');

-- 查看当前值
SELECT last_value FROM articles_id_seq;