必须先确保该列现有数据全非null,否则alter table ... modify会直接失败;创建表时直接加not null最安全,语法为字段定义末尾写not null;已有表需先update填充null值,再modify加约束,且not null与default可共存但分工明确。

必须先确保该列现有数据全非 NULL,否则 ALTER TABLE ... MODIFY 会直接失败。
创建表时直接加 NOT NULL
最安全、最推荐的方式。语法简单,无数据校验风险:
-
NOT NULL写在字段定义末尾,紧挨类型,中间不加逗号 - 主键字段默认隐含
NOT NULL,无需重复写 - 空字符串
''、数字0都合法,只有NULL被拒绝
示例:
CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) );
插入时若漏填 name 或显式写 INSERT INTO user VALUES (1, NULL, 'a@b.com');,会报错:ERROR 1048 (23000): Column 'name' cannot be null
给已有表的列添加 NOT NULL
关键限制:MySQL 会检查该列所有现存记录,只要有一行是 NULL,MODIFY 就会中断并报错。
- 必须先用
UPDATE把所有NULL值补上(比如设为''或0) - 语句用
MODIFY或CHANGE都可以,但CHANGE需重复写两次列名 - 如果列有默认值,
NOT NULL不影响默认值行为;没默认值时,后续插入必须显式提供值
正确流程:
UPDATE user SET name = '' WHERE name IS NULL; ALTER TABLE user MODIFY name VARCHAR(50) NOT NULL;
NOT NULL 和 DEFAULT 要不要一起用?
要看业务逻辑——两者不冲突,而是分工明确:
- 只加
NOT NULL:强制用户每次插入都必须提供值 - 加
NOT NULL DEFAULT 'unknown':允许省略该字段,由数据库自动填默认值 - 如果已设
NOT NULL但没设DEFAULT,又想允许省略字段,必须先加DEFAULT,否则报错Field 'xxx' doesn't have a default value
示例(追加默认值):
ALTER TABLE user ALTER COLUMN name SET DEFAULT 'anonymous';
真正容易被忽略的是:约束生效后,应用层 INSERT 语句若习惯性省略字段、或 ORM 自动生成 SQL 时未处理好字段映射,就会突然爆错。上线前务必用真实数据集跑一遍 DML 测试。











