DBeaver数据比较功能通过主键对齐两库快照逐字段比对差异,需右键表选Simple Data Compare、勾选Compare only data、确保主键存在,修改记录仅识别主键相同但字段值不同的行。

直接看“数据比较”功能,不是查日志、也不是翻历史 SQL —— DBeaver 本身不记录你改了哪行数据,它只在你主动发起比对时,按主键对齐两份快照(比如测试库 vs 生产库),逐字段算出差值。想看到“修改前后”,你得先有“前”和“后”两个状态。
怎么启动一次有效的数据比较
关键不是点“比较”,而是选对对象、配对主键、确认加载完成:
- 必须是两个已连接的数据库(不能是同一库的两张表,除非手动导出为 CSV 再导入为临时表)
- 右键表 →
Compare→Simple Data Compare,别选错成Structure Compare - 在比较设置页,勾选
Compare only data(取消Compare structure),否则会混入字段增删等结构差异 - 确保两边表都有主键或唯一索引;若没有,DBeaver 会退化为全表笛卡尔积匹配,极慢且不准
- 点击
Compare后,等待右下角状态栏显示 “Comparison completed”,再操作过滤 —— 半途点过滤可能漏数据
为什么“修改记录”没显示出来
常见原因不是功能失效,而是比对逻辑没对上:
-
修改记录类型只识别“主键相同但至少一个字段值不同”的行。如果某行主键在目标表不存在,它会被归为删除记录(源有目标无),而非“修改” - 时间戳类字段(如
updated_at)默认每次 UPDATE 都变,会导致大量“假修改”。解决办法:在过滤面板中取消勾选该字段,或提前在比较设置里勾选Ignore columns并填入列名 - NULL 值比较行为特殊:
NULL = NULL在 SQL 中为 UNKNOWN,DBeaver 默认按此语义处理。若你期望把NULL ↔ ''视为差异,需确认字段类型是否允许隐式转换(如 MySQL 的VARCHAR与TEXT) - 大文本字段(
TEXT、JSON)若长度超 4000 字符,DBeaver 可能截断后比较,造成“看起来一样实则不同”。可在比较设置中启用Compare full LOB values
如何只看某几个字段的变更
字段过滤不是“高亮”,而是“结果裁剪”——只保留你勾选字段发生变更的整行记录:
- 打开比较结果视图 → 点击工具栏漏斗图标 → 展开
Fields filter区域 - 取消勾选
Select all fields→ 手动勾选你关心的字段,例如price、status、stock - 点
Apply后,结果中只会出现“至少一个被勾选字段有变化”的行;哪怕price没变但remark变了,这行也不会出现 - 这个过滤条件不保存到比较设置中,每次新开比较都要重设。如需复用,可提前在比较设置页勾选
Save filter settings(部分版本支持)
对比结果里“修改”和“新增+删除”容易混淆
这是最常被忽略的逻辑陷阱:DBeaver 不做 UPDATE 推断,只做静态快照比对。比如源表 ID=100 的行从 status='pending' 变成 'done',目标表里 ID=100 行存在且值不同 → 显示为 修改记录。但如果你在目标表里先删了 ID=100,又插入了一条新 ID=101 的类似记录,DBeaver 会把它拆成一条 删除记录(ID=100) + 一条 新增记录(ID=101),而不会识别为“移动”或“重写”。所以看到大量新增+删除共存,先检查业务逻辑是否涉及主键变更或批量重建,而不是怀疑工具不准。

















