PostgreSQL中查序列当前值应执行SELECT last_value FROM sequence_name;DBeaver属性面板显示的“当前值”仅为缓存快照,不实时,多会话并发后常失准。

PostgreSQL里查序列当前值,别信DBeaver的“属性面板”
DBeaver的序列节点右键 → “编辑”打开的属性窗口里显示的“当前值”,大概率是缓存值或上次读取快照,不是实时 CURRVAL。尤其在多会话并发操作后,这个数字经常不准。真要确认当前值,必须执行 SQL 查询。
正确做法是运行:
SELECT last_value FROM your_sequence_name;
注意:last_value 是序列内部维护的最新已分配值,等价于当前会话中刚调用过 NEXTVAL 后的 CURRVAL;但若当前会话还没用过该序列,last_value 仍可能有效(取决于是否被其他会话推进过)。
-
last_value可查,但仅对已至少被NEXTVAL推进过的序列有效 - 若想强制获取当前会话可见的值,先执行一次
SELECT nextval('your_sequence_name');,再查CURRVAL - 直接查
CURRVAL会报错ERROR: currval of sequence "xxx" is not yet defined in this session,除非本会话已调用过NEXTVAL
Oracle查序列当前值:没有CURRVAL概念,得靠查询数据字典
Oracle 不提供类似 PostgreSQL 的 CURRVAL 函数,也没有 last_value 字段可直查。它的序列当前状态不对外暴露——严格来说,“当前值”本身不是 Oracle 序列的持久化属性,只存在于内存/缓存中。
能查到的只是元数据定义,比如起始值、增量、是否循环等:
SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences WHERE sequence_name = 'YOUR_SEQ_NAME';
last_number 字段常被误认为“当前值”,但它其实是 Oracle 在最近一次 CREATE SEQUENCE 或 ALTER SEQUENCE RESTART 时记录的“预分配起点”,并非实时值。真实下一次 NEXTVAL 返回什么,无法通过查询确定。
- Oracle 中不存在可靠、非侵入式的方式读取“当前值”
- 如果必须知道下一次取值,唯一办法是执行
SELECT your_seq.NEXTVAL FROM dual,但这会实际消耗一个号 - 生产环境慎用
NEXTVAL试探,尤其在高并发或 ID 敏感场景
MySQL 和 MariaDB 根本没有原生序列,查不到就对了
MySQL 8.0+ 虽引入了 SEQUENCE 插件对象,但默认未启用,且 DBeaver 不会自动识别或展示它。绝大多数 MySQL 用户用的是 AUTO_INCREMENT,这不是序列对象,而是表级属性。
所以你在 DBeaver 左侧导航器里根本看不到 “Sequences” 节点,这不是配置问题,是数据库本身不支持。想看自增列当前最大值,得查表本身:
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'your_table';
这个 AUTO_INCREMENT 值表示“下一条插入将使用的 ID”,但它可能因删除、回滚、手动设置而跳变,也不代表“当前已用到哪”。
- MySQL 没有
nextval/currval机制,别在 DBeaver 里找序列节点 -
information_schema.TABLES.AUTO_INCREMENT是估算值,受事务隔离级别影响,不一定精确 - MariaDB 同理,原生无标准序列;部分版本可通过虚拟序列表模拟,但 DBeaver 不识别
DBeaver 刷新序列节点后值没变?可能是元数据加载没触发
在 PostgreSQL 或 Oracle 连接中,右键序列 → “刷新”后,DBeaver 有时仍显示旧的 last_number 或定义参数,尤其在修改过 ALTER SEQUENCE ... RESTART WITH 之后。
这是因为 DBeaver 默认不会主动重载序列元数据,除非你手动触发“重新读取元数据”:
- 右键数据库连接 → “编辑连接” → 切换到“初始化”标签页 → 勾选“连接后刷新元数据”
- 或者右键对应 schema / user → “刷新元数据”(不是“刷新”)
- 某些版本需额外勾选“读取序列详细信息”,在连接设置 → “元数据” → “高级”里
不设这个,DBeaver 就按初始连接时缓存的元数据展示,后续 ALTER SEQUENCE 对界面无感。这也是为什么改了起始值后界面又“弹回去”——它压根没去数据库重新查。











