“不是 NULL”复选框仅控制字段后续插入或更新是否允许NULL:勾选即加NOT NULL约束,取消勾选才允许存NULL;它不修改历史数据、不影响默认值,也不自动填充NULL。

“不是 NULL”复选框到底控制什么
它只决定该字段后续插入或更新时是否允许 NULL 值:勾选即加 NOT NULL 约束,取消勾选才允许存 NULL。它不修改已有数据,也不影响默认值设置——哪怕你没设默认值,勾选后照样会报错;哪怕你设了默认值,取消勾选后仍可显式插入 NULL。
常见误解是以为“取消勾选 = 自动填 NULL”,其实不是:取消勾选只是放开限制;新记录若未赋值且无默认值,MySQL 才按规则填 NULL(仅限非主键、非自增等常规字段)。
主键字段会自动强制勾选“不是 NULL”,无法手动取消。
设置非空 + 默认值必须同步操作
单独勾选“不是 NULL”却不设默认值,会导致所有未显式赋值的 INSERT 失败;单独设默认值但不勾选“不是 NULL”,则 NULL 仍可写入,默认值形同虚设。
实操中应同时完成两步:
- 勾选“不是 NULL”复选框
- 在“默认”输入框中填入实际值(如
''、0、CURRENT_DATE)
注意:CURRENT_DATE 这类函数不能直接打字输入——要点击默认值右侧的 … 按钮,选“表达式”标签页,输入 CURRENT_DATE(不带引号、不带括号),否则会被存成字符串字面量。
修改已有字段时为什么保存失败
Navicat 在保存时静默失败或弹出模糊提示,常见原因有:
- 表中已有该字段为
NULL的记录 → 必须先执行UPDATE your_table SET your_column = '' WHERE your_column IS NULL - 字段被外键引用 → 提示
Can't modify column 'xxx': used in a foreign key constraint→ 需先临时禁用外键检查或手动解除约束 - 字段类型是
TEXT或BLOB却误设了默认值 → 报错ERROR 1101: BLOB/TEXT column 'xxx' can't have a default value→ 改用MEDIUMTEXT或去掉默认值
强烈建议点击“SQL 预览”按钮,确认生成的语句是否为类似 ALTER TABLE `t` MODIFY COLUMN `c` VARCHAR(255) NOT NULL DEFAULT '';若含 DEFAULT NULL 或带引号的 'CURRENT_DATE',说明配置无效。
默认值为空字符串时的几个细节
把 DEFAULT 设为空(即输入框完全空白)且勾选“不是 NULL”,Navicat 会自动生成 DEFAULT '',这是安全做法。但要注意:
-
VARCHAR字段设DEFAULT ''没问题;TEXT字段在 MySQL 5.7+ 支持,但老版本不支持,需确认数据库版本 - 如果字段原为
NULL,改完后历史数据不会自动更新——必须手动UPDATE清理,否则保存结构变更会失败 - 导出再导入表结构时,Navicat 有时会把
DEFAULT CURRENT_DATE错写成DEFAULT 'CURRENT_DATE',务必人工核对 DDL
最易忽略的一点:字段允许 NULL 时,即使设了默认值,INSERT INTO t(col) VALUES (NULL) 依然存 NULL,不会 fallback 到默认值——只有省略字段名或用 DEFAULT 关键字才会触发默认逻辑。


















