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 在執(zhí)行查詢時,會基于統(tǒng)計信息判斷是否使用索引。當某字段大量為 NULL
,即使建了索引,也可能不走索引。
示例
CREATE TABLE orders ( id INT PRIMARY KEY, status VARCHAR(10) DEFAULT NULL ); CREATE INDEX idx_status ON orders(status); -- 插入數(shù)據(jù),其中 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
是允許的,這意味著你不能依賴唯一約束阻止重復(fù)插入。
示例
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); -- 成功!
坑四:聚合函數(shù)行為不一致
當你做統(tǒng)計時,NULL
會被自動忽略,導(dǎo)致結(jié)果不一致。
示例
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;
推薦實踐
場景 | 推薦做法 |
---|---|
字符字段 | 默認值設(shè)為 '' ,加 NOT NULL |
數(shù)值字段 | 默認值設(shè)為 0 ,加 NOT NULL |
時間字段 | 使用 CURRENT_TIMESTAMP |
是否布爾值 | 使用 TINYINT(1) ,默認值為 0 |
CREATE TABLE users ( id INT PRIMARY KEY, is_active TINYINT(1) NOT NULL DEFAULT 0 );
總結(jié)
字段默認值為 NULL
看似靈活,但它隱藏的問題遠多于你預(yù)期的:
- 查詢難寫
- 索引不穩(wěn)
- 統(tǒng)計不準
- 唯一性失效
所以,除非你真的需要表示“未知”或“無意義”,強烈建議避免使用 NULL 作為默認值。
到此這篇關(guān)于MySQL字段默認值為NULL時的避坑指南的文章就介紹到這了,更多相關(guān)MySQL字段默認值為NULL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL必知必會讀書筆記第四章之檢索數(shù)據(jù)
MySQL是一種開放源代碼的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。接下來通過本文給大家介紹MYSQL必知必會讀書筆記第四章之檢索數(shù)據(jù),感興趣的朋友一起學習吧2016-05-05Mysql刪除重復(fù)數(shù)據(jù)保留最小的id 的解決方法
這篇文章主要介紹了Mysql刪除重復(fù)數(shù)據(jù)保留最小的id 的解決方法,需要的朋友可以參考下2017-10-10MySQL 8中新增的這三大索引 隱藏、降序、函數(shù)
這篇文章主要介紹了MySQL 8.x版本中新增的三大索引 隱藏索引、降索引序、函數(shù)索引,如果文章對你有點幫助,小伙伴們點贊、收藏、評論、分享走起呀2021-09-09mysql 查詢數(shù)據(jù)庫中的存儲過程與函數(shù)的語句
mysql 查詢數(shù)據(jù)庫中的存儲過程與函數(shù)的語句,需要的朋友可以參考下。2011-05-05