Navicat 17 设计表中设 CURRENT_TIMESTAMP 默认值需勾选“表达式”复选框,否则会被加引号当字符串处理;TIMESTAMP 支持界面配置默认值和自动更新,DATETIME 需手动补 ON UPDATE;修改字段须显式设 NOT NULL;导出 SQL 需勾选“扩展属性”才能保留默认函数。
navicat 17 的「设计表」界面能设默认值,但 current_timestamp 这类函数必须勾选“表达式”复选框,否则会被当字符串处理,直接失效。
字段默认值输 CURRENT_TIMESTAMP 却不生效?
不是 Navicat 抽风,是它把默认值分成了「静态值」和「表达式」两类,UI 上没明说,但逻辑严格区分:
- 没勾选「表达式」复选框时,
CURRENT_TIMESTAMP会被自动加上单引号,变成DEFAULT 'CURRENT_TIMESTAMP'—— MySQL 当成普通字符串存,插入时不会计算时间 - 只有勾选了「表达式」,Navicat 才生成
DEFAULT CURRENT_TIMESTAMP(无引号),MySQL 才识别为函数 - 该复选框通常在「默认值」输入框右侧,图标是
f(x)或文字标“表达式”,位置固定但容易被忽略
TIMESTAMP 和 DATETIME 字段设置方式不同
类型选错,再怎么勾表达式也没用:
-
TIMESTAMP:Navicat 界面支持完整映射,默认值 + 「自动更新」勾选项会分别生成DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP -
DATETIME:界面不提供「自动更新」勾选;即使填了CURRENT_TIMESTAMP并勾表达式,也只生成默认值部分;如需自动更新,必须切到「SQL」页手动补ON UPDATE CURRENT_TIMESTAMP - MySQL 5.6.5+ 才支持
DATETIME的函数默认值;低于此版本,填了也报错或静默失败
修改已有字段时,Navicat 容易漏掉关键约束
右键表 →「设计表」→ 改完保存,背后 SQL 很可能不完整:
- 给已存在的
created_at字段加DEFAULT CURRENT_TIMESTAMP,Navicat 默认只改DEFAULT,不会自动加NOT NULL—— 而 MySQL 对TIMESTAMP字段要求显式声明NOT NULL才能启用默认行为 - 如果字段原为允许
NULL,又没手动勾选「不是 NULL」,插入NULL会覆盖默认值,而不是触发填充 - 想同时支持插入自动填 + 更新自动改,必须确认两个字段都设对:
created_at只设默认值、updated_at需同时勾「表达式」+「自动更新」
导出 SQL 时 DEFAULT CURRENT_TIMESTAMP 消失了?
这不是 Bug,是 Navicat 导出逻辑的兼容性策略:
- 右键表 →「转储 SQL 文件」→ 默认导出模式叫「结构仅」,但「扩展属性」选项默认关闭
-
DEFAULT CURRENT_TIMESTAMP被归类为“非标准扩展”,不勾选「导出扩展属性」,就完全不写进 SQL - 务必在导出对话框里找到并勾选「扩展属性」(位置通常在「格式」或「高级」区域),否则迁移或重建表时时间戳逻辑全丢
最稳的方式始终是:先在「设计表」里配好类型和基础属性,然后立刻切到右上角「SQL」页检查生成语句,手动补全 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP —— 绕过所有 UI 解析歧义。


















