直接取消勾选“允许 NULL”会失败,因MySQL要求加NOT NULL前必须确保列无NULL值且已设默认值,否则报ERROR 1138;Navicat仅映射UI状态,不自动清理数据或填充默认值。
直接取消勾选“允许 null”不会生效,甚至可能报错——除非你同时处理好已有 null 数据和默认值。
为什么点一下“非空”勾选框就失败?
Navicat 的表设计器里,“允许 NULL”只是 UI 状态映射,背后执行的是 ALTER TABLE ... MODIFY COLUMN 或 CHANGE COLUMN。MySQL 要求:给已有数据的字段加 NOT NULL 约束前,必须确保该列当前没有 NULL 值,且显式指定 DEFAULT(或已有默认值)。否则会报 ERROR 1138: Invalid use of NULL value。
- 表里已有 10 条记录,其中 3 条
name是NULL→ 直接勾掉“允许 NULL” → 执行失败 - 字段类型是
VARCHAR(50),但没设默认值 → 即使全非空,也会卡住 - Navicat 不会自动帮你填充默认值或清理 NULL,它只按你点的生成 DDL
实际操作前必须检查的三件事
打开查询窗口,先跑这几条:
SELECT COUNT(*) FROM `your_table` WHERE `your_column` IS NULL;
如果结果 > 0,得先补数据或删行;
SHOW COLUMNS FROM `your_table` LIKE 'your_column';
看 Default 列是否为空,空就得手动加默认值;
SELECT @@sql_mode;
若含 STRICT_TRANS_TABLES,对 NULL 更敏感,不容忍隐式转换。
安全加 NOT NULL 的两种路径
推荐用 SQL 模式操作,可控性强:
- 路径一(有 NULL 数据):先更新 NULL → 再加约束
UPDATE your_table SET your_column = '未知' WHERE your_column IS NULL;ALTER TABLE your_table MODIFY COLUMN your_column VARCHAR(50) NOT NULL; - 路径二(想保留 NULL 兼容性但逻辑上非空):加默认值再约束
ALTER TABLE your_table ALTER COLUMN your_column SET DEFAULT '暂无';ALTER TABLE your_table MODIFY COLUMN your_column VARCHAR(50) NOT NULL;
注意:MODIFY 和 CHANGE 都会触发表重建(尤其大表),InnoDB 下若带外键或 innodb_online_alter_log_max_size 不足,可能锁表数分钟。
Navicat 设计器里最容易踩的坑
你以为只是点个勾,其实 Navicat 在后台悄悄拼了整条 CHANGE COLUMN:
- 改字段名时漏写类型 → 它用
TEXT回退,导致精度丢失 - 取消“允许 NULL”后没点“保存”,而是直接关窗 → 修改丢失,且不提示
- 在“设计表”里改完点“保存”,Navicat 默认不加
ALGORITHM=INPLACE,5.7+ 仍可能降级为COPY算法 - 字段是主键/唯一索引的一部分 → 加
NOT NULL会连带重建索引,耗时陡增
真正要在线、低风险地加非空约束,别依赖设计器点一点——先清 NULL、设默认、再手写带 ALGORITHM=INPLACE 的 MODIFY,最后用 SHOW PROCESSLIST 看状态是不是 altering table 而不是 copy to tmp table。


















