Navicat 16模型转SQL不导出DEFAULT值是设计限制,非bug;需手动补ALTER语句,注意字符串加单引号、数字不加、时间类型需调sql_mode;反向工程可解决,但依赖源表已有DEFAULT。
导出SQL里字段DEFAULT值为空,不是bug是设计限制
navicat 16 的「模型转sql」功能(即从er图导出ddl)默认不生成default子句,哪怕你在模型里为字段填了默认值。这不是漏配或权限问题,而是该功能本身不读取模型中default value字段的元数据——它只导出类型、长度、是否为空、主键等基础结构信息。
验证方法:在模型中双击某字段 → 「Default Value」栏填入'pending' → 右键模型 → 「导出SQL」→ 查看生成的CREATE TABLE语句,你会发现DEFAULT完全没出现。
必须手动补DEFAULT,但要注意类型写法差异
不能依赖导出自动带,默认值得在目标库建表后单独用ALTER TABLE加。不同字段类型补法不同,错一个符号就报错:
- 字符串字段(
VARCHAR、TEXT):必须用英文单引号包裹,DEFAULT ''或DEFAULT 'active';写成DEFAULT active会触发ERROR 1064 - 数字字段(
INT、DECIMAL):不加引号,DEFAULT 0或DEFAULT 99.99;加了引号如DEFAULT '0'会报Incorrect integer value -
DATETIME/TIMESTAMP字段设零值:MySQL 8.0+严格模式下需先临时关闭NO_ZERO_DATE:SET SESSION sql_mode = (SELECT REPLACE(@@sql_mode, 'NO_ZERO_DATE,NO_ZERO_IN_DATE', ''));<br>ALTER TABLE t MODIFY c DATETIME DEFAULT '0000-00-00 00:00:00';
- 自增主键(
id):模型里勾了AUTO_INCREMENT,但导出SQL没带,得手动补INT AUTO_INCREMENT PRIMARY KEY,不能只写DEFAULT
想让下次导出带DEFAULT?换用「数据库转模型」反向流程
如果你已有带DEFAULT的真实表结构,可以绕过模型编辑缺陷:
- 右键目标数据库 → 「逆向数据库到模型」→ 勾选「包括默认值」
- 这样生成的模型会真实反映
DEFAULT定义,再导出SQL就能带上了 - 注意:此操作会覆盖当前模型,提前备份原模型文件(
.nm) - 若源表本身也没设
DEFAULT,那反向也导不出——根本还在表结构上,不在Navicat界面里
批量修复几十张表的DEFAULT,别点界面,直接跑SQL
挨个进Navicat「设计表」界面点太慢。用INFORMATION_SCHEMA查缺失项,生成批量ALTER语句:
SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY `', column_name, '` ',<br> column_type, ' DEFAULT ',<br> CASE data_type<br> WHEN 'varchar' THEN CONCAT('''''''')<br> WHEN 'int' THEN '0'<br> ELSE '''NULL'''<br> END, ';') AS ddl<br>FROM information_schema.columns<br>WHERE table_schema = 'your_db'<br> AND is_nullable = 'NO'<br> AND column_default IS NULL<br> AND data_type NOT IN ('timestamp');
执行结果是可直接运行的SQL列表。重点检查data_type和column_type字段,column_type含括号精度(如varchar(255)),比data_type更准;时间类型要单独处理,避免零值拦截。
最易被忽略的是:Navicat模型编辑器里填的默认值,只是UI层缓存,不落地到任何数据库元数据。只要没真正执行ALTER或重建表,那个值就只是画在图上的字。











