DBeaver刷新无效的根源在于分层缓存机制未同步,需针对性执行REFRESH METADATA、Refresh All或勾选Refresh metadata重载元数据,而非依赖F5。

改完数据刷新不出来,大概率不是数据库没改成功,而是 DBeaver 没拿到最新元数据或没走对刷新路径。 它默认不自动同步变更,尤其在复杂查询、无主键表、事务未提交等场景下,「刷新」按钮根本不起作用。
为什么 F5 刷新没用?
因为 F5 默认只刷新导航树节点的显示状态(比如展开/折叠),并不强制重载表结构或查询结果的元数据。它调用的是轻量级 refreshObject(),而你真正需要的是「清缓存 + 重拉数据」。
- PostgreSQL 的
PostgreTableBase.refreshObject()只清约束和索引缓存,不碰列定义缓存 - MySQL 连接若启用了
Server side object filters,即使刷新了,新表也可能被过滤掉 - ER 图编辑器、SQL 编辑器、结果集面板各自维护独立缓存,彼此不联动
刷新结果集数据时,必须勾选「Refresh metadata」
直接在查询结果里改数据后点「Refresh Data」,默认只重新执行原 SQL,不会更新字段列表或类型信息。如果你新增了列、改了字段名,旧结果集仍按老结构渲染。
- 右键结果集 →
Refresh Data→ 勾选Refresh metadata再确认 - 对应底层调用的是
IResultSetPresentation.refreshData(true, ...) - 如果执行的是
SELECT * FROM t1 JOIN t2这类多表查询,DBeaver 无法生成 UPDATE,此时「Refresh Data」只会重新查一遍,改不了库
表结构变了但导航树/补全不更新
这是元数据缓存没失效导致的典型现象。即使你执行了 ALTER TABLE ADD COLUMN,DBeaver 仍显示旧字段列表,SQL 补全也识别不到新列。
- 优先执行 SQL 命令:
REFRESH METADATA;(PostgreSQL/MySQL 均支持,DBeaver 专有命令) - 或者右键连接 →
Refresh All(快捷键Ctrl+Shift+R),它会触发DBPDataSource.refreshMetadata() - 避免只右键某个 Schema 刷新——如果表在其他 Schema 下,就刷不到
- MySQL 用户注意:若连接配置里填了固定
Database名,会导致只加载该库,其他库的表永远不出现
修改保存失败却显示“成功”?检查事务和虚拟键
复制一行后改值,点保存没报错但刷新回来还是旧数据,常见于两种隐形失败:
- 事务模式是
manual commit,但你没点右下角的Commit按钮,改写实际还在事务里没落库 - 表没有主键或唯一索引,DBeaver 无法构造
WHERE条件,于是静默跳过更新;可右键表 →Edit Data→ 齿轮图标 →Define Virtual Key手动指定 - 执行后去
Query Manager或Error Log看真实发出的 SQL,如果看到UPDATE ... WHERE id = NULL,基本就是虚拟键没设对
最易被忽略的一点:DBeaver 的「刷新」从来不是原子操作,它分层缓存、分场景生效。同一个连接下,你可能刚在 SQL 编辑器里执行了 REFRESH METADATA;,但 ER 图还是旧结构,结果集字段也没变——因为它们根本不共享同一份缓存实例。


















