一、问题背景
在升级到 IntelliJ IDEA 2025.3.1 之后,使用 Database Tools 导出 SQL 更新语句时出现了一个非常危险的变化。
在 SQL Data Export 中选择 "SQL Updates" 后,生成的语句可能变成:
UPDATE orders SET status = 'DONE';
没有 WHERE 条件。
而在升级前的版本中,同样的操作通常会生成:
UPDATE orders
SET status = 'DONE'
WHERE order_no = 'A001';
同一张表、同一个数据库,仅仅因为 IDEA 版本升级,导出结果发生了变化。
二、这不是偶然,而是 2025.3.1 引入的机制变化
从 IntelliJ IDEA 2025.3 和 2025.3.1 开始,JetBrains 对 Database Tools 的元数据加载机制进行了优化:
-
表的 Primary Key 和 Unique Index 改为表级懒加载
-
不再在 DataSource 级别自动加载所有表的唯一性信息
-
Export → SQL Updates 不会主动向数据库查询主键
这个优化提升了性能,但带来了一个非常危险的副作用:
如果表的唯一性信息尚未被加载进缓存,导出的 UPDATE 语句就不会带 WHERE。
三、IDEA 在导出 SQL Updates 时到底使用了什么
当你执行
Open Data → Export Data → SQL Updates
IDEA 并不会向数据库查询主键,而是直接使用当前 Table 节点中缓存的唯一性信息(Primary Key 或 Unique Index)。
如果缓存中有主键或唯一索引,则生成:
UPDATE orders
SET status = 'DONE'
WHERE order_no = 'A001';
如果缓存为空,则生成:
UPDATE orders
SET status = 'DONE';
四、为什么新建 DataSource 特别容易中招
新建 DataSource 后:
-
IDEA 只加载 schema 列表
-
每一张表的主键和唯一索引信息都是"未加载状态"
如果你直接:
Open Data → Export → SQL Updates
你实际上是在一个"冷表节点"上导出,IDEA 认为它没有任何唯一性信息,于是生成了不带 WHERE 的 UPDATE。
这就是为什么:
旧 DataSource 有 WHERE
新 DataSource 没有 WHERE
五、为什么"选中表 → Refresh"可以立刻修复
当你在 Database 窗口中执行:
展开 schema → 选中 table → 右键 → Refresh(或 Ctrl+F5)
IDEA 才会真正向数据库拉取:
-
Primary Key
-
Unique Index
-
约束信息
并把它们写入该表节点的缓存中。
从这一刻开始:
-
DataGrid 修改会带 WHERE
-
Export → SQL Updates 也会带 WHERE
六、完整复现步骤
-
升级到 IntelliJ IDEA 2025.3.1
-
新建一个 DataSource
-
不展开表,不 refresh
-
执行:Open Data → Export → SQL Updates
-
得到:UPDATE table SET ...
-
点击表 → Refresh
-
再次导出,得到:UPDATE table SET ... WHERE ...
七、为什么这个问题在 2025.3.1 更容易出现
在旧版本中,IDEA 更频繁地自动加载表的主键信息,很多情况下你"无意中"已经刷新过表。
在 2025.3.1 中,表级元数据更依赖"显式 Refresh",而 Export SQL Updates 不会触发表级元数据加载,因此在未刷新过的表上导出时必然生成无 WHERE 的 UPDATE。
八、团队必须遵守的操作规范
第一,新建 DataSource 后,在任何导出或修改前,必须对目标表执行一次 Refresh。
第二,表结构必须有 Primary Key 或 Unique Index,否则 IDEA 永远无法安全生成 WHERE。
第三,在 IDEA 中开启无 WHERE 警告:
Settings → Tools → Database → Data Editor and Viewer → 勾选
Warn if UPDATE or DELETE without WHERE
Confirm data modification
第四,Ubuntu mysql8增加配置,限制 update、delete 必须携带 where
mysql
sql_safe_updates = 1
九、最终结论
在 IntelliJ IDEA 2025.3.1 中,Export → SQL Updates 是否带 WHERE,不取决于 DataSource 是否刷新,而取决于该表节点是否已经缓存了 Primary Key 或 Unique Index 信息。
只有在你对该表执行过 Refresh 后,IDEA 才会生成安全的 UPDATE 语句。