DBeaver“Generate DDL”默认不包含索引、约束和注释,必须手动在设置中勾选Include indexes、Include constraints、Include comments;批量导出时索引仍可能丢失,因Export Database与Generate DDL逻辑不同、驱动元数据支持不足或对象类型(如视图)未被识别。

“生成DDL”默认不包含索引,必须手动勾选
右键表 → Generate DDL 弹出的窗口里,默认只输出 CREATE TABLE 语句,INDEX、FOREIGN KEY、COMMENT 全部被隐藏。这不是 Bug,是 DBeaver 的保守设计:避免在开发库误执行带约束的语句导致失败。关键操作是点击右上角齿轮图标(Settings),在弹出面板中必须显式勾选:Include indexes、Include constraints、Include comments。漏掉任一选项,导出的 SQL 就不是“完整 DDL”。
导出整个 schema 时,索引仍可能丢失的三个原因
即使对单表启用全部 DDL 选项,批量导出多个表或整个 schema 时,索引仍常消失。根本原因是 DBeaver 的 Export Database 向导和 Generate DDL 功能底层逻辑不同:
-
Export Database默认走的是「数据迁移通道」,DDL 仅作为附属产物,Include indexes选项藏在Advanced标签页里,且不随单表设置继承 - 某些数据库驱动(如旧版 MySQL Connector/J)不返回
getIndexInfo()元数据,DBeaver 拿不到索引定义,勾了也白勾 - 视图、物化视图、分区表等对象的索引不会被自动识别,需单独右键其所属 schema →
Generate DDL并再次确认设置
MySQL 下 CREATE INDEX 语句生成不兼容老版本
DBeaver 生成的索引语句默认用 CREATE INDEX idx_name ON table_name (col) 形式,但 MySQL 5.7 及更早版本不支持对 JSON、Generated Column 字段建索引的语法变体。若你导出的语句含 STORED 或 VIRTUAL 关键字,导入时会报错 ERROR 1064。解决办法是:
- 在
Generate DDL设置中关闭Use column expressions in index definitions(该选项默认开启) - 对 MySQL 5.7 环境,额外勾选
Use legacy index syntax(部分驱动版本支持) - 手动检查生成结果中是否出现
FUNCTIONAL KEY—— 这是 MySQL 8.0.13+ 特性,5.7 无法识别
PostgreSQL 导出唯一索引变成 UNIQUE CONSTRAINT
PostgreSQL 中,唯一索引(CREATE UNIQUE INDEX)和唯一约束(ALTER TABLE ... ADD CONSTRAINT ... UNIQUE)语义等价,但 DBeaver 默认优先生成后者。这会导致两个问题:
- 如果原索引带
WHERE条件(部分索引),CONSTRAINT写法完全不支持,直接丢失 - 某些迁移工具(如 Flyway)对
CONSTRAINT和INDEX的处理顺序不同,可能引发外键依赖错误 - 解决方式:在
Generate DDL设置中取消勾选Generate constraints instead of unique indexes,强制输出CREATE UNIQUE INDEX原始语句


















