Navicat中设置CURRENT_TIMESTAMP等函数默认值必须勾选“表达式”复选框,否则会被存为字符串;TIMESTAMP支持界面配置默认值和自动更新,DATETIME需手动补全ON UPDATE;修改字段时需确保NOT NULL;导出SQL须勾选“扩展属性”。

CURRENT_TIMESTAMP、CURRENT_DATE 这类函数默认值,不勾「表达式」就等于白设——Navicat 会自动加单引号存成字符串,MySQL 根本不认。
为什么输 CURRENT_TIMESTAMP 却生成 DEFAULT 'CURRENT_TIMESTAMP'?
Navicat 把默认值严格分为「静态值」和「表达式」两类,UI 上没明说,但逻辑硬性隔离:
- 没点
fx按钮或没勾「表达式」复选框时,任何输入(包括CURRENT_TIMESTAMP)都会被包裹单引号,变成DEFAULT 'CURRENT_TIMESTAMP'—— MySQL 当字符串处理,插入时直接存字面量 - 只有启用表达式模式后输入
CURRENT_TIMESTAMP(不加引号、括号可选),才会生成真正的DEFAULT CURRENT_TIMESTAMP - 该复选框位置固定:在字段属性面板的「默认值」输入框右侧,图标是
fx或文字标“表达式”,极易被忽略
TIMESTAMP 和 DATETIME 的默认值与自动更新行为差异
类型选错,再怎么勾表达式也没用:
MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。
-
TIMESTAMP:Navicat 界面完整支持,默认值 + 「自动更新」勾选项会分别生成DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP -
DATETIME:界面不提供「自动更新」勾选;即使填了CURRENT_TIMESTAMP并勾表达式,也只生成默认值部分;如需ON UPDATE,必须切到「SQL」页手动补全 - MySQL 5.6.5+ 才支持
DATETIME的函数默认值;低于此版本,建表会直接报错Invalid default value for 'xxx'
修改已有字段时 NOT NULL 是隐形门槛
给已存在的 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 - 务必在导出对话框里找到并勾选「扩展属性」(位置通常在「高级」或「选项」标签页下)
最常被漏掉的其实是三件事:表达式开关、NOT NULL 约束、导出时的「扩展属性」勾选——这三项缺一不可,少一个,CURRENT_TIMESTAMP 就只是个字符串。

















