欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL字段默認值為NULL時的避坑指南

 更新時間:2025年05月09日 09:13:03   作者:DashBoot  
在 MySQL 中,字段默認值為 NULL 是一種常見設(shè)計,但如果你不小心,NULL 會成為你系統(tǒng)中最隱蔽的問題源頭之一,本文將通過真實 SQL 示例,帶你了解默認值為 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)文章

最新評論