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

1次阅读

用 alter table modify column 显式加 NULL 可修改字段为允许 null,如 alter table users modify column phone varchar(20) null;mysql 默认允许 null,但设过 not null 后必须显式恢复。

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

如何用 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 不支持)
  • 如果字段带默认值或索引,NULLdefault 可共存,但外键列若被引用,修改前需确认参照完整性是否受影响

创建表时怎么控制 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 NULLDEFAULT 同时存在是合法的,但若字段已设 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 路径。

text=ZqhQzanResources