该报错是MySQL严格模式下典型拦截:目标表字段NOT NULL且无DEFAULT,同步脚本INSERT时未显式提供值。需先DESCRIBE确认字段定义,再为字符串、数字、时间等类型按规范补DEFAULT,自增主键须勾选AUTO_INCREMENT;Navicat同步不修改结构,必须手动修复。
同步报错 Field ‘xxx’ doesn’t have a default value 怎么定位
这是 mysql 严格模式下最典型的插入拦截:目标表字段不允许 null,又没设 default,而同步脚本尝试 insert 时不显式提供该列值,mysql 直接拒绝。navicat 数据同步默认走标准 insert 语句,不会自动补空值或忽略缺失字段。
关键要区分是源库字段本身就没设默认值,还是目标库结构比源库少字段(即同步前没做结构同步)——后者更常见。先连上目标库执行:DESCRIBE table_name;,对比源库字段定义,确认报错字段是否真的缺失 Default 值列。
在 Navicat 同步前手动为字段加 DEFAULT 值的实操步骤
别依赖同步工具自动处理,直接在目标库补上缺失的默认值最稳。注意不是所有类型都适用同一写法:
- 字符串字段(
VARCHAR、TEXT)必须用英文单引号包裹,默认值为空字符串写成DEFAULT '',不能漏引号,否则触发ERROR 1064 - 数字字段(
INT、DECIMAL)默认值不加引号,如DEFAULT 0;误加引号会报Incorrect integer value - 时间字段(
DATETIME、TIMESTAMP)若想设“零值”,需先临时关闭 SQL 模式:SET SESSION sql_mode = (SELECT REPLACE(@@sql_mode, 'NO_ZERO_DATE,NO_ZERO_IN_DATE', ''));,再执行ALTER TABLE ... MODIFY column_name DATETIME DEFAULT '0000-00-00 00:00:00'; - 自增主键字段(
id)报这个错,大概率是没勾选AUTO_INCREMENT,进 Navicat「设计表」界面直接勾上即可,不用写 SQL
为什么不能靠 Navicat 同步设置自动补默认值
Navicat 的数据同步功能只负责搬运已有数据,它不修改目标表结构。即使你勾选了「同步结构」,它也只按源库 DDL 重建表,不会智能识别“目标表少一个默认值”然后单独 ALTER —— 那属于结构差异,得走结构同步流程,且必须确保源库字段本身已定义 DEFAULT。
常见误区是以为勾了「删除目标中不存在的记录」或「更新已存在记录」就能绕过这个错,其实完全无关。INSERT 语句构造阶段就失败了,根本到不了数据比对逻辑。
批量修复多个表缺失默认值的快速方法
如果目标库几十张表都缺默认值,一个个点 Navicat 界面太慢。可以直接导出目标库当前结构:mysqldump --no-data --skip-triggers db_name > schema_before.sql,再导出源库结构:mysqldump --no-data --skip-triggers source_db > schema_source.sql,用文本工具(如 VS Code)对比,找出所有目标库字段定义里缺少 DEFAULT 关键字的地方,生成批量 ALTER TABLE 语句。
重点盯防:业务表里非主键的 NOT NULL 字段,尤其是 created_at、status、is_deleted 这类高频字段——它们最容易在建表时被漏掉默认值,又恰好被同步脚本 INSERT 时跳过。











