MySQL字段默认值为NULL时的避坑指南
坑一:逻辑混乱 —— NULL ≠ 空值
你可能以为 NULL = '' 是真,实际却是假或未知。这是三值逻辑的典型陷阱。
示例
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50) DEFAULT NULL
);
INSERT INTO users (id) VALUES (1);
-- 看似查空名,其实查不到
SELECT * FROM users WHERE name = '';
-- 查 NULL 必须显式写:
SELECT * FROM users WHERE name IS NULL;
坑二:索引命中率低
MySQL 在执行查询时,会基于统计信息判断是否使用索引。当某字段大量为 NULL,即使建了索引,也可能不走索引。
示例
CREATE TABLE orders (
id INT PRIMARY KEY,
status VARCHAR(10) DEFAULT NULL
);
CREATE INDEX idx_status ON orders(status);
-- 插入数据,其中 90% 是 NULL
INSERT INTO orders (id, status)
SELECT t1.a, IF(t1.a % 10 = 0, 'PAID', NULL)
FROM mysql.help_topic t1 LIMIT 1000;
-- 查询 NULL 值可能不走 idx_status
EXPLAIN SELECT * FROM orders WHERE status IS NULL;
坑三:唯一索引失效
在唯一索引中,多个 NULL 是允许的,这意味着你不能依赖唯一约束阻止重复插入。
示例
CREATE TABLE email_users (
id INT PRIMARY KEY,
email VARCHAR(255) DEFAULT NULL,
UNIQUE KEY uniq_email(email)
);
INSERT INTO email_users (id, email) VALUES (1, NULL);
INSERT INTO email_users (id, email) VALUES (2, NULL); -- 成功!
坑四:聚合函数行为不一致
当你做统计时,NULL 会被自动忽略,导致结果不一致。
示例
CREATE TABLE survey (
id INT PRIMARY KEY,
age INT DEFAULT NULL
);
INSERT INTO survey (id, age) VALUES (1, 20), (2, NULL), (3, 30);
SELECT COUNT(age) AS count_age, AVG(age) AS avg_age FROM survey;
推荐实践
| 场景 | 推荐做法 |
|---|---|
| 字符字段 | 默认值设为 '',加 NOT NULL |
| 数值字段 | 默认值设为 0,加 NOT NULL |
| 时间字段 | 使用 CURRENT_TIMESTAMP |
| 是否布尔值 | 使用 TINYINT(1),默认值为 0 |
CREATE TABLE users (
id INT PRIMARY KEY,
is_active TINYINT(1) NOT NULL DEFAULT 0
);
总结
字段默认值为 NULL 看似灵活,但它隐藏的问题远多于你预期的:
- 查询难写
- 索引不稳
- 统计不准
- 唯一性失效
所以,除非你真的需要表示“未知”或“无意义”,强烈建议避免使用 NULL 作为默认值。
到此这篇关于MySQL字段默认值为NULL时的避坑指南的文章就介绍到这了,更多相关MySQL字段默认值为NULL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
安装MySQL在最后的start service停住了解决方法
今天为一个客户配置服务器的时候,发现的问题,原来他自己安装过mysql但安全没有配置好,路径选择的也不好,重新安装后发现在start service卡住了,通过下面的方法解决了,特分享下2013-11-11
安装MySQL时,输入mysqld --install后,显式该文件已存在问题
这篇文章主要介绍了安装MySQL时,输入mysqld --install后,显式该文件已存在问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-12-12
mysql8.0及以上my.cnf设置lower_case_table_names=1无法启动问题
这篇文章主要介绍了mysql8.0及以上my.cnf设置lower_case_table_names=1无法启动问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-11-11


最新评论