默认值不生效的三大主因:字段允许null、insert显式写入该列、或default被加引号当成字符串;navicat中须勾选“表达式”并输入current_timestamp(无引号),且字段需设为not null,datetime在5.6.5+才支持函数默认值,推荐优先使用timestamp类型。
默认值不生效,不是 navicat 没保存,而是 mysql 根本没触发默认逻辑——常见原因就三个:字段允许 null、insert 语句显式写了该列、或者默认值被当成字符串存进去了。
DEFAULT 值被加了引号,MySQL 当成字面量
Navicat 的「默认值」输入框默认走静态值路径。你输 CURRENT_TIMESTAMP 却没勾「表达式」复选框,它会自动生成 DEFAULT 'CURRENT_TIMESTAMP' —— 单引号一包,MySQL 就当普通字符串存,插入时当然不会计算时间。
- 必须手动点默认值右侧的
f(x)图标或「表达式」按钮,再输入CURRENT_TIMESTAMP(不带引号、不带括号) -
CURRENT_DATE、NOW()同理,不勾表达式=白配 - 导出 SQL 后务必检查 DDL:看到的是
DEFAULT CURRENT_TIMESTAMP还是DEFAULT 'CURRENT_TIMESTAMP'
字段允许为 NULL,插入 NULL 时跳过默认值
MySQL 规则很明确:只要 INSERT 显式给了 NULL 或字段本身定义为 NULL,就不会回退到 DEFAULT。哪怕你设了 DEFAULT CURRENT_TIMESTAMP,插 NULL 还是存 NULL。
- 在 Navicat「设计表」里,务必勾选「不是 NULL」(即
NOT NULL) - 插入语句中,要么省略该字段,要么写
DEFAULT,别写NULL或空字符串 - 对已有表加默认值,Navicat 不会自动补
NOT NULL,得手动勾,否则无效
DATETIME 字段填了 CURRENT_TIMESTAMP 却报错或静默失败
DATETIME 类型从 MySQL 5.6.5 才支持函数默认值,且 Navicat 界面根本不提供「自动更新」勾选项;而 TIMESTAMP 类型界面支持完整映射,默认值 + ON UPDATE 都能点出来。
- 优先用
TIMESTAMP类型配CURRENT_TIMESTAMP,兼容性最好、UI 支持最全 - 若必须用
DATETIME,得切到「SQL」页手写:DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP - MySQL 版本低于 5.6.5?函数默认值直接不识别,建表就会报 1064,别挣扎
最容易被忽略的一点:Navicat 的「设计表」改完保存,只保证生成 ALTER 语句,但不会校验你是否漏了 NOT NULL、是否类型不匹配、是否版本不支持——这些都得你盯着 DDL 看,不能信 UI 显示。尤其是跨版本迁移或同步目标库时,字段看着一样,底层约束可能差了一大截。











