Navicat模型转SQL不生成DEFAULT是设计限制,非bug;需手动补ALTER语句或通过反向工程从已有表结构导出带DEFAULT的DDL。
Navicat 模型里填了 DEFAULT 却不生成 DDL?这是设计限制
navicat 16/17 的「模型转 sql」功能压根不读取模型中字段的 default value 属性,哪怕你在 er 图里双击字段、在「默认值」栏填了 'active' 或 current_timestamp,导出的 create table 语句里也绝不会出现 default 子句。这不是配置漏了,也不是权限问题,是功能本身不支持。
验证很简单:模型中设好默认值 → 右键模型 → 「导出SQL」→ 打开生成文件搜 DEFAULT,基本为空。想靠模型自动生成带默认值的建表语句,这条路走不通。
给 DATETIME/TIMESTAMP 字段设 CURRENT_TIMESTAMP 必须点 fx 按钮
直接在「默认值」框里输 CURRENT_TIMESTAMP 会被当字符串处理,最终生成 DEFAULT 'CURRENT_TIMESTAMP',插入时存的是字面量,不是时间戳。
- 选中字段 → 找到右侧属性面板的「默认值」输入框
- 点击输入框右侧的
fx按钮(或勾选「表达式」复选框) - 在弹出窗口的「表达式」页签里输入
CURRENT_TIMESTAMP(不加引号、不加括号) - 保存后该字段显示为
EXPRESSION: CURRENT_TIMESTAMP
注意:CURRENT_TIMESTAMP 只对 TIMESTAMP 和 DATETIME 类型生效;MySQL 版本必须 ≥ 5.6.5 才支持 DATETIME DEFAULT CURRENT_TIMESTAMP;如果还要自动更新,得额外勾选「ON UPDATE」并再次输入 CURRENT_TIMESTAMP。
字符串、数字、日期类型默认值写法差异大,错一个符号就报错
手动补 ALTER TABLE 时,不同类型的默认值写法不能混用:
- 字符串字段(
VARCHAR、TEXT):必须加英文单引号,如DEFAULT 'pending';写成DEFAULT pending触发ERROR 1064 - 数字字段(
INT、DECIMAL):不加引号,如DEFAULT 0;写成DEFAULT '0'报Incorrect integer value -
DATE字段用CURRENT_DATE:同样要进表达式模式输入,不能输字符串;NOW()和CURDATE()兼容性差,优先用CURRENT_DATE -
DATETIME设零值:MySQL 8.0+ 严格模式下需先调sql_mode,否则DEFAULT '0000-00-00 00:00:00'会失败
想让导出 SQL 带 DEFAULT?别依赖模型,用反向工程
唯一可靠办法是绕过模型编辑缺陷,从真实表结构反向生成模型:
- 右键目标数据库 → 「逆向数据库到模型」
- 勾选「包括默认值」
- 生成的模型会真实反映源表的
DEFAULT定义,再导出 SQL 就能带上
注意:此操作会覆盖当前模型,务必提前备份 .nm 文件;若源表本身没设 DEFAULT,反向也导不出——根本不在 Navicat 界面里,而在表结构本身。
模型只是草图,不是权威数据源;真正起作用的永远是 MySQL 实际执行的 DDL。补默认值这事,要么改表结构,要么改建表语句,别指望模型界面替你兜底。


















