mysql如何设置null和not null_mysql空值处理方法

来源:这里教程网 时间:2026-02-28 20:51:31 作者:

如何用 ALTER TABLE 修改字段为允许 NULL

直接执行

ALTER TABLE ... MODIFY COLUMN
并显式加上
NULL
即可,这是最常用也最稳妥的方式。MySQL 默认字段就是允许 NULL 的,但一旦你之前设过
NOT NULL
,就必须显式改回来。

ALTER TABLE users MODIFY COLUMN phone VARCHAR(20) NULL;
—— 修改已有字段,必须写完整数据类型
不能只写
ALTER TABLE users ALTER COLUMN phone SET NULL
(这是 PostgreSQL 语法,MySQL 不支持)
如果字段带默认值或索引,
NULL
DEFAULT
可共存,但外键列若被引用,修改前需确认参照完整性是否受影响

创建表时怎么控制 NULL/NOT NULL

建表阶段就定好,比后期修改更安全。不写约束 = 默认

NULL
;写了
NOT NULL
才真正禁止空值。

CREATE TABLE orders (id INT PRIMARY KEY, status VARCHAR(10) DEFAULT 'pending');
→ status 允许 NULL(因为没写
NOT NULL
CREATE TABLE orders (id INT PRIMARY KEY, status VARCHAR(10) NOT NULL DEFAULT 'pending');
→ status 强制有值,且插入时不填会自动用
'pending'
注意:
NOT NULL
DEFAULT
同时存在是合法的,但若字段已设
NOT NULL
,再加
DEFAULT
主要是为简化 INSERT 语句,不是“兜底防 NULL”

为什么改完允许 NULL 后老查不到数据?

常见错觉:字段改成

NULL
了,以为旧数据会自动变为空 —— 实际不会。原值不变,只是“以后可以插 NULL”了。

已有非空数据仍保持原样,
SELECT * FROM users WHERE phone IS NULL
返回空,因为历史记录里根本没 NULL
真要补 NULL,得手动
UPDATE users SET phone = NULL WHERE id IN (1,2,3);
或者批量清理空字符串:
UPDATE users SET phone = NULL WHERE phone = '';
(注意:
''
NULL
事务中操作更稳妥:
BEGIN; UPDATE ...; ALTER TABLE ...; COMMIT;

NULL 值参与运算和查询的坑

MySQL 中

NULL
是“未知”,不是“空”也不是“零”,所有涉及它的比较和计算结果都是
NULL
,极易导致逻辑漏判。

SELECT 1 + NULL;
→ 结果是
NULL
,不是
1
WHERE status = NULL
永远不成立,必须写
WHERE status IS NULL
索引字段含大量 NULL 时,
IS NULL
查询可能走不到索引(尤其 B+Tree),建议配合
status IS NULL OR status = 'xxx'
时留意执行计划
聚合函数如
COUNT(status)
自动忽略 NULL,而
COUNT(*)
统计所有行 —— 这个差异常被误用

改约束本身很简单,难的是改完之后业务代码是否兼容

NULL
、前端是否展示异常、报表逻辑是否崩掉。上线前务必在测试环境跑一遍真实查询和 INSERT/UPDATE 路径。

相关推荐