navicat 16模型中的current_timestamp默认值不生效,因其模型仅存储字符串字面量、不解析函数,导出sql时默认忽略该值;需手动编辑生成的sql文件,添加default current_timestamp后执行。
navicat 16 的「模型」(model)不是实时数据库,它不执行 sql,也不校验默认值语法——直接在模型字段里填 current_timestamp 会保存成功,但导出 sql 或生成表时大概率被忽略或报错。
为什么模型里设了 CURRENT_TIMESTAMP 却不生效
Navicat 模型(ERD)本质是设计草图,它的「默认值」字段只接受字符串字面量,不解析函数。你输入 CURRENT_TIMESTAMP,模型会当成普通文本存下来;等你右键「生成 SQL」或「同步到数据库」时,Navicat 默认生成的 DDL 里不会包含 DEFAULT CURRENT_TIMESTAMP,除非你手动干预 SQL 输出模板或勾选特定选项。
- 模型字段属性中的「默认值」框 ≠ 实际建表语句中的
DEFAULT子句 - 即使你填了
CURRENT_TIMESTAMP(6),导出的 CREATE TABLE 语句里该字段仍可能是created_at DATETIME NULL,没带默认值 - 模型不校验 MySQL 版本兼容性,比如在标为 MySQL 5.5 的模型里给
DATETIME设函数默认值,也不会警告
正确做法:用模型生成 SQL 后,手动补全 DEFAULT CURRENT_TIMESTAMP
这是唯一可靠路径。模型只管结构关系,时间默认值必须落到 SQL 层。
- 完成模型设计 → 右键模型 → 「生成 SQL」→ 勾选「生成创建语句」→ 保存为 .sql 文件
- 用编辑器打开该 SQL 文件,找到对应字段定义行,例如:
`created_at` DATETIME - 在其后追加
DEFAULT CURRENT_TIMESTAMP(注意空格),如:`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP - 若需微秒精度且字段是
DATETIME(6),则写成DEFAULT CURRENT_TIMESTAMP(6) - 执行这个修改后的 SQL 创建表,而非直接「同步到数据库」
想让模型“看起来”支持函数默认值?别依赖界面输入框
模型编辑器里的「默认值」输入框对函数类值完全不可靠。真要留个标记供团队理解,可用以下方式:
- 在字段「注释(Comment)」里写:
DEFAULT CURRENT_TIMESTAMP — set manually in SQL - 把字段「数据类型」设为
TIMESTAMP(不是DATETIME),因为 Navicat 模型对TIMESTAMP的默认值识别稍强一点,但仍不保证导出正确 - 避免在模型中设置「自动更新」勾选项——模型不区分
DEFAULT和ON UPDATE,导出时极易混淆
模型是画布,不是执行环境。所有时间相关的默认逻辑,最终都得靠手写或校验 SQL 落地。哪怕你用的是 Navicat 16 最新版,这点也没变。











