如何用 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 路径。
