最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 是允許的,這意味著你不能依賴唯一約束阻止重復插入。

示例

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 會被自動忽略,導致結(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 看似靈活,但它隱藏的問題遠多于你預期的:

  • 查詢難寫
  • 索引不穩(wěn)
  • 統(tǒng)計不準
  • 唯一性失效

所以,除非你真的需要表示“未知”或“無意義”,強烈建議避免使用 NULL 作為默認值。

到此這篇關(guān)于MySQL字段默認值為NULL時的避坑指南的文章就介紹到這了,更多相關(guān)MySQL字段默認值為NULL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql 多表聯(lián)合更新的項目實踐

    Mysql 多表聯(lián)合更新的項目實踐

    本文介紹MySQL多表更新方法,對于多表的UPDATE操作需要慎重,建議在更新前,先使用 SELECT 語句查詢驗證更新的數(shù)據(jù)與自己期望的是否一致,下面就來詳細的介紹一下
    2025-06-06
  • 關(guān)于MySQL8.x group_by報錯的4種解決方案

    關(guān)于MySQL8.x group_by報錯的4種解決方案

    這篇文章主要介紹了關(guān)于MySQL8.x group_by報錯的4種解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • mysql常用命令以及小技巧

    mysql常用命令以及小技巧

    這篇文章主要分享的是mysql常用命令以及小技巧,概述清理二進制日志、mysqldump不鎖表、mysql跳過空事務等相關(guān)資料展開主題,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • 為MySQL安裝配置代理工具Kingshard的基本教程

    為MySQL安裝配置代理工具Kingshard的基本教程

    這篇文章主要介紹了為MySQL安裝配置代理工具Kingshard的基本教程,Kingshard由Go語言寫成,可以實現(xiàn)讀寫分離和客戶端IP訪問控制等功能,非常強大,需要的朋友可以參考下
    2015-12-12
  • MySQL中時間函數(shù)操作大全

    MySQL中時間函數(shù)操作大全

    在使用SQL語言進行數(shù)據(jù)查詢和數(shù)據(jù)分析中,常常需要借助日期時間函數(shù)來計算相關(guān)的指標或生成日期輔助列,下面這篇文章主要給大家介紹了關(guān)于MySQL中時間函數(shù)操作的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • MySQL系列之redo log、undo log和binlog詳解

    MySQL系列之redo log、undo log和binlog詳解

    這篇文章主要介紹了MySQL系列之redo log、undo log和binlog詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Mysql高性能優(yōu)化技能總結(jié)

    Mysql高性能優(yōu)化技能總結(jié)

    這篇文章主要介紹了Mysql高性能優(yōu)化技能總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2020-02-02
  • MySQL中的字符替換示例詳解

    MySQL中的字符替換示例詳解

    本文介紹了 MySQL 中的兩種字符替換函數(shù):REPLACE 和 REGEXP_REPLACE,通過這兩個函數(shù)的使用,我們可以方便地進行字符替換操作,提高數(shù)據(jù)處理的效率和準確性,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • mysql報錯ERROR 2003(HY000)問題及解決過程

    mysql報錯ERROR 2003(HY000)問題及解決過程

    這段文章主要描述了在修改MySQL配置文件后遇到連接故障的解決過程,通過重新啟動服務、重新注冊服務以及恢復數(shù)據(jù)目錄等步驟成功解決
    2026-06-06
  • MySQL觸發(fā)器使用過程詳解

    MySQL觸發(fā)器使用過程詳解

    觸發(fā)器,就是一種特殊的存儲過程。觸發(fā)器和存儲過程一樣是一個能夠完成特定功能、存儲在數(shù)據(jù)庫服務器上的SQL片段。本文將通過簡單的實力介紹一下觸發(fā)器的操作,需要的可以參考一下
    2023-03-03

最新評論

阜宁县| 苍梧县| 外汇| 察雅县| 襄城县| 浏阳市| 汶川县| 增城市| 区。| 沂南县| 合水县| 礼泉县| 安西县| 米脂县| 呈贡县| 德江县| 青阳县| 浮梁县| 永德县| 福安市| 竹北市| 额敏县| 红安县| 元阳县| 呼玛县| 马山县| 张北县| 增城市| 鱼台县| 体育| 金乡县| 茂名市| 临安市| 四会市| 上饶县| 三明市| 蓝田县| 离岛区| 泽州县| 开鲁县| 乌兰察布市|