报错“Invalid default value”是因MySQL 5.7+默认启用NO_ZERO_DATE和NO_ZERO_IN_DATE严格模式,禁止'0000-00-00'类零日期;临时解法为SET SESSION sql_mode = REPLACE(@@session.sql_mode, 'NO_ZERO_IN_DATE,NO_ZERO_DATE', ''),仅当前Navicat连接生效。
报错“Invalid default value”是严格模式在拦你
直接看 select @@sql_mode; 返回值里有没有 no_zero_date 或 no_zero_in_date —— 有就必炸,尤其当你设了 '0000-00-00'、'0000-00-00 00:00:00' 这类零日期,默认值栏一填就 1067 报错。这不是 navicat 的 bug,是 mysql 5.7+ 默认开启的校验在起作用。
临时绕过:只对当前连接生效,适合还原或测试
在 Navicat 的 SQL 窗口里执行这句就行:
SET SESSION sql_mode = (SELECT REPLACE(@@session.sql_mode, 'NO_ZERO_IN_DATE,NO_ZERO_DATE', ''));
-
SESSION是关键,GLOBAL需要 SUPER 权限,普通账号基本被拒 - 用
REPLACE安全删掉两个模式项,不会误伤其他项(比如STRICT_TRANS_TABLES) - 关掉 Navicat 或重连后失效,每次新开连接都得再跑一遍
- 如果还原中途断开,得手动补上,否则后面语句继续报 1067
字符串、数字、时间字段设默认值的写法差异
Navicat 界面填默认值时,类型不匹配是最常踩的坑:
- 字符串字段(
VARCHAR、TEXT)必须加英文单引号:DEFAULT 'abc',写成DEFAULT abc或DEFAULT "abc"都会触发ERROR 1064 - 数字字段(
INT、DECIMAL)不能加引号:DEFAULT 0正确,DEFAULT '0'会报Incorrect integer value - 时间字段设
CURRENT_TIMESTAMP:必须裸写,不加引号、不加括号;且优先用TIMESTAMP类型,DATETIME在旧版 MySQL 或 Navicat UI 中容易生成带引号的非法语法 - 想设零时间(如
'0000-00-00 00:00:00')?先临时关掉严格模式(见上一条),再执行ALTER TABLE ... MODIFY ... DEFAULT '0000-00-00 00:00:00'
自增主键报“Field ‘id’ doesn’t have a default value”?别动默认值
这个错通常不是默认值问题,而是 AUTO_INCREMENT 没勾上。进 Navicat「设计表」界面,找到 id 字段,确认「自动递增」复选框已打钩。如果用 SQL 修改,得写 MODIFY id INT AUTO_INCREMENT,光写 DEFAULT 没用。
真正麻烦的是批量修复——几十张表都缺默认值时,别靠点界面,导出结构后用脚本批量加 DEFAULT 更稳。Navicat 同步本身不修结构,它只搬数据,字段定义不一致就得人肉补。


















