MySQL非空约束(NOT NULL)用于确保列值不为NULL,创建表时直接定义最稳妥;修改现有表需先清理NULL值;它不限制空字符串或0等“逻辑空”值。

创建表时直接加 NOT NULL 最稳妥
只要字段在业务上「必须有值」,就该在 CREATE TABLE 阶段明确加 NOT NULL。这是最干净、最无副作用的方式。
常见错误是只写类型不写约束,比如:name VARCHAR(50) —— 这默认允许 NULL,后续再补会卡住。
-
NOT NULL必须紧跟数据类型后,不能隔开(如VARCHAR(50) NOT NULL✅,VARCHAR(50) DEFAULT '' NOT NULL❌ 语法报错) - 主键列自动隐含
NOT NULL,无需重复写 - 如果字段同时需要默认值和非空,可以合用:
status TINYINT NOT NULL DEFAULT 1 - 注意:
DEFAULT NULL和NOT NULL冲突,建表会直接失败
ALTER TABLE ... MODIFY 添加非空前必须清空 NULL 值
对已有表执行 ALTER TABLE t MODIFY col INT NOT NULL 时,MySQL 会检查该列现存所有行——只要有一条是 NULL,整条语句就失败,报错类似:ERROR 1265 (01000): Data truncated for column 'col' at row 1 或更直白的 Column 'col' cannot be null。
这不是语法问题,而是数据校验失败。
- 先运行
SELECT COUNT(*) FROM t WHERE col IS NULL;确认是否真有NULL - 若有,得先用
UPDATE t SET col = 0 WHERE col IS NULL;(按实际业务填合理默认值) - 再执行
MODIFY;CHANGE也可用,但写法更啰嗦:ALTER TABLE t CHANGE col col INT NOT NULL - 别用
ALTER TABLE ... ADD CONSTRAINT ... NOT NULL—— MySQL 不支持这种写法
NULL 和空字符串 ''、数字 0 完全不是一回事
新手常误以为「只要字段有内容就不算空」,但 MySQL 的 NOT NULL 只管是否为 NULL,不管是不是 '' 或 0。这两者都合法通过非空检查。
比如:INSERT INTO user (name) VALUES (''); 能成功,哪怕业务上「姓名不能为空字符串」——这得靠应用层或 CHECK 约束(MySQL 8.0.16+ 才真正生效)来兜底。
-
NOT NULL不阻止''、0、'0'、' '等“逻辑空”值 - 想拦住空字符串?得额外加条件:
name VARCHAR(50) NOT NULL CHECK (name != '') - 想同时禁止
NULL和空格填充?CHECK (TRIM(name) != '')
删掉非空约束只需去掉 NOT NULL,但别漏掉数据类型
用 ALTER TABLE t MODIFY col VARCHAR(50) 就能移除非空约束——注意这里没写 NOT NULL,等价于显式声明可空。
容易踩的坑是只写 ALTER TABLE t MODIFY col NOT NULL,这会报错:缺少数据类型。
- 正确写法只有两种:
MODIFY col VARCHAR(50)或CHANGE col col VARCHAR(50) - 别指望
DROP NOT NULL这种伪语法,MySQL 没这个关键字 - 删掉后,旧数据里的
NULL值立刻合法,但新插入仍可继续设NULL











