勾选“不是 NULL”需先确保现有数据无NULL值,否则报错;正确顺序为:先UPDATE填充默认值→勾选“不是 NULL”→清空默认框→确认SQL含DEFAULT子句再保存。
勾选“不是 NULL”只是第一步,不处理数据会直接报错
navicat 里勾选字段的 不是 null 复选框,本质是生成 alter table ... modify column ... not null 语句。但 mysql 要求:执行前,该字段**所有现有行都不能为 null**。否则立刻报错:error 1138: invalid use of null value。
常见翻车场景:
- 原字段是
VARCHAR(50) DEFAULT NULL,你只勾选不是 NULL,没动默认栏 → Navicat 生成纯NOT NULL,无DEFAULT,执行失败 - 表里已有 10 条记录,其中 3 条该字段值为
NULL→ 点保存时弹窗报错或静默跳过 - 字段被外键引用或带
CHECK约束 → 报错可能是Can't modify column 'xxx': used in a foreign key constraint
正确顺序只有这一种:
- 先手动执行
UPDATE your_table SET your_column = '' WHERE your_column IS NULL(或填合理默认值,如0、'unknown') - 回到设计表,勾选
不是 NULL -
默认输入框必须完全清空(不填任何字符,包括空格)→ 此时 Navicat 才生成NOT NULL DEFAULT '' - 点“SQL 预览”,确认语句含
DEFAULT子句,再保存
主键字段自动 NOT NULL,但不能取消勾选
主键字段在 Navicat 设计表界面中,不是 NULL 复选框始终处于勾选且禁用状态。这不是 UI Bug,而是 MySQL 强制行为:主键必须非空且唯一。你无法通过界面取消它,也不该尝试绕过。
注意两个边界情况:
- 联合主键中的某个字段,仍受此约束,哪怕它单独看逻辑上可为空
- 如果误删主键定义后重新添加,Navicat 会自动重置该字段的
不是 NULL状态
大表加 NOT NULL 字段,别依赖“一键保存”
对百万级以上数据的表,直接在设计表新增一个 NOT NULL 字段并设默认值,Navicat 预览显示 ADD COLUMN xxx INT NOT NULL DEFAULT 0,看起来没问题 —— 但 MySQL 实际执行可能触发全表 COPY,锁表数分钟甚至更久。
稳妥做法分三步:
- 先
ADD COLUMN xxx INT DEFAULT 0(允许 NULL,不锁表) - 用分批
UPDATE填充默认值,每批 1 万行,避免长事务 - 最后
MODIFY COLUMN xxx INT NOT NULL(此时无 NULL 值,安全)
Navicat 不会自动拆解这三步,SQL 预览 是你唯一能提前识别风险的地方。
右键“设置为 NULL”和改字段约束是两码事
在数据查看界面双击单元格 → 右键 → 设置为 NULL,这只是单条记录的值更新操作,和字段定义无关。哪怕字段本身是 NOT NULL,这一步也会直接报错。
所以:
- 想让某几条记录的某个字段变
NULL:用右键或写UPDATE ... SET col = NULL WHERE ... - 想让所有新插入记录都能不填该字段(即允许
NULL):必须进“设计表”,取消勾选不是 NULL - 字段允许
NULL时,右键选项可用;字段是NOT NULL时,右键选项灰掉或报错
真正容易被忽略的是:改完 不是 NULL 状态后,老数据一个字节都不会变。比如原来存的是空字符串 '',改成允许 NULL 后它还是 '',不会自动转成 NULL。











