MySQL中设置字段为NOT NULL需在建表时直接定义或通过ALTER TABLE的MODIFY/CHANGE修改,已存NULL值须先清理;可配合DEFAULT提升易用性,是保障数据完整性的基础约束。

在 MySQL 中,设置字段为非空(NOT NULL)是通过在创建表或修改表结构时添加 NOT NULL 约束实现的。它能确保该字段必须有值,不能插入 NULL,是保障数据完整性最基础的约束之一。
建表时直接定义 NOT NULL
这是最常用的方式,在 CREATE TABLE 语句中为字段明确指定 NOT NULL:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
age INT
);说明:
- username 和 email 字段被设为 NOT NULL,插入数据时必须提供值;
- age 没加 NOT NULL,允许为 NULL(除非有其他默认行为,如严格模式下可能报错);
- 主键字段(如 id)默认隐式具备 NOT NULL 属性,无需重复写。
修改已有字段为 NOT NULL
对已存在的表,用 ALTER TABLE + MODIFY 或 CHANGE 实现:
- 使用 MODIFY(不改字段名):
ALTER TABLE users MODIFY email VARCHAR(100) NOT NULL;
- 使用 CHANGE(可同时改名和属性):
ALTER TABLE users CHANGE email email VARCHAR(100) NOT NULL;
注意:
- 若原字段已有 NULL 值,执行会失败;需先更新数据,把 NULL 改为有效值;
- 修改前建议备份,尤其在线上环境;
- 非空约束不可单独“添加”,必须配合字段类型重定义(即 MODIFY/CHANGE)。
取消 NOT NULL 约束(设为允许 NULL)
如果需要放宽限制,可将字段改回允许 NULL:
ALTER TABLE users MODIFY username VARCHAR(50) NULL;
或更明确地写成:
ALTER TABLE users MODIFY username VARCHAR(50); -- 不写 NULL 也默认允许 NULL
说明:
- 显式写 NULL 更清晰,但不是必须;
- 取消约束不会影响已有数据,只是放开插入/更新时的校验。
NOT NULL 和 DEFAULT 的配合使用
常与 DEFAULT 结合,避免插入时漏填又不想让应用层强校验:
CREATE TABLE logs (
id INT PRIMARY KEY AUTO_INCREMENT,
message TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);说明:
- message 必须显式提供;
- created_at 允许不填,自动补当前时间,但仍保持非空;
- 这种组合既保证字段不为空,又降低使用门槛。
不复杂但容易忽略:NOT NULL 是 DDL 层的数据规则,MySQL 在插入或更新时实时校验,违反会直接报错(如 “Column 'xxx' cannot be null”),所以设计阶段就合理设定,比后期修复更高效。










