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