[TOC] #### 1. 前言 --- 建議 MySQL 數(shù)據(jù)庫字段一定要設(shè)置 NOT NULL 這句建議你可能聽好多人講過,但是有沒有仔細(xì)想過為什么別人這么說 ? 在實(shí)際開發(fā)中,對使不使用 not null 很多人并沒有一個明確的標(biāo)準(zhǔn),要知道某個字段需不需要添加 not null,首先,要知道 null 和 not null 之間的區(qū)別,這樣你才能更好的玩轉(zhuǎn) not null,也避免了在項(xiàng)目中可能遇到的一些坑 #### 2. 使用 not null 的理由 --- **一、語義不清晰** null 和 not null 使用空值代表的含義是不一樣的 null 我們可以認(rèn)為這一列的值是未知的,空值則可以認(rèn)為我們知道這個值,只不過它是空的而已 比如一張表的 name 字段是 null,我們可以認(rèn)為不知道名字是什么,反之如果是空字符串我們知道沒有名字,它就是一個空值 **二、聚合函數(shù)計算不準(zhǔn)確** 對于 null 值的列,使用聚合函數(shù)的時候會忽略 null 值 比如表里面有兩條數(shù)據(jù),其中一條數(shù)據(jù)的 name 字段值為 null,如果對 name 進(jìn)行 count,表示對非 null 列進(jìn)行統(tǒng)計,所以查出來的結(jié)果為 1,這顯然是不符合我們的預(yù)期的。但是,在實(shí)際開發(fā)中一般都是對 id 字段進(jìn)行統(tǒng)計數(shù)量 ![](https://img.itqaq.com/art/content/7608ae3537978c211d98505f7ddacc61.png) **三、導(dǎo)致等號表達(dá)式失效** 比如表的 name 字段是 null,如果使用等號查詢,是查不到的,必須使用 `is null` 才能查詢出來 ![](https://img.itqaq.com/art/content/1024c84c55abe47bc9a0f695296df6e6.png) **四、導(dǎo)致值運(yùn)算失效** 比如表的 age 字段值是 null,加 1 之后結(jié)果還是 null,name 字段值是 null,concat 之后結(jié)果也變成了 null,這也是不符合我們預(yù)期的 ![](https://img.itqaq.com/art/content/cbd8b347d6a2b8334dcc4378e670d1b3.png) **五、一些意想不到的問題** 比如表里面只有一條 name 為 **高啟強(qiáng)** 的數(shù)據(jù),但是查詢不等于 **高啟強(qiáng)** 的數(shù)據(jù)時,顯示只有一條,這顯然不符合我們的預(yù)期 ![](https://img.itqaq.com/art/content/90502175564395d483fd8e35705fe97d.png) #### 3. 到底要不要使用 not null --- 個人開發(fā)建議,大多數(shù)字段應(yīng)該設(shè)置 not null,配合默認(rèn)值 default 使用更好 比如: 用戶狀態(tài)字段 status,只有兩個值 0 禁用 1 正常。應(yīng)該設(shè)置 not null 并設(shè)置默認(rèn)值為 1