PostgreSQL 查看某个自增字段(序列)当前最新值
在 PostgreSQL 中,查看「某个自增字段(序列)」当前最新值,要分清 序列是否已被使用过。下面按 最常用 -> 最严谨 -> 最安全 总结。
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
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
);
如果你的表是:
id INTEGER GENERATED ALWAYS AS IDENTITY
找到序列名:
SELECT pg_get_serial_sequence('articles', 'id');
然后:
SELECT last_value FROM articles_id_seq;
SELECT last_value FROM xxx_id_seq;
A:序列不回滚,事务失败也会消耗值。
A:查询 pg_sequences,不使用 nextval()。
- ❌ 用 nextval() 当查看
- ❌ 认为序列值一定连续
- ❌ 忘记导入数据后同步序列
✅ 最推荐日常用的 2 条
-- 查看序列
SELECT pg_get_serial_sequence('articles', 'id');
-- 查看当前值
SELECT last_value FROM articles_id_seq;