為什么建議MySQL列屬性盡量用 NOT NULL?


之前面試的時候面試官問在數據庫中,兩個null是相等的嗎?當時天真的我回答應該是吧,其實null是一個空值,如果非要必要比較的話,兩個null比較應該還是null。在 MySQL 中,NULL 表示不知道的數據。

字段盡可能用NOT NULL,而不是NULL,除非特殊情況。

img
上圖是《高性能 MySQL》4.1節中對於null值的描述,由此看來,把null改為not null對於提升索引的性能並沒有什么顯著的提升。避免使用null值的目的,是為了代碼的可讀性和可維護性。也為了避免下文出現的一些稀奇古怪的問題。
如下建兩個表t1,t2,其中一個表的name字段允許為空,另一個表的name字段不允許為空,分別為name字段建立索引,SQL語句如下。

![img1](https://mmbiz.qpic.cn/mmbiz_png/R5ic1icyNBNd7IPeEicG7RuKOYdjpGSwHEsXe6mvOrSdEyMXjfHk5mibEOjrpenNWZ27uV5thib1QoPs2aSQpuXgZGg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
![img2](https://mmbiz.qpic.cn/mmbiz_png/R5ic1icyNBNd7IPeEicG7RuKOYdjpGSwHEspg9rp455ggXWQ99MHYo32d9HN7bZugf0iaQkzFgciamjsVkN3kibjf2Vw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
![img3](https://mmbiz.qpic.cn/mmbiz_png/R5ic1icyNBNd7IPeEicG7RuKOYdjpGSwHEsbM3PrFYtbn5YRkrt7rxBqAAmzIPlIlW94Jab73JgZ2dS4ISVjXB5OQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
![img4](https://mmbiz.qpic.cn/mmbiz_png/R5ic1icyNBNd7IPeEicG7RuKOYdjpGSwHEsoV4NXEK8DcBXjxGHHwAamngU7mU3WnqC0bUwd10dyq1J1GM51PiaEww/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

1、NOT IN、!= 等負向條件查詢在有 NULL 值的情況下返回非空行的結果集 1、NOT IN、!= 等負向條件查詢在有 NULL 值的情況下返回非空行的結果集

比如上例中的 t2,我執行如下 SQL 語句。

SELECT * from t2 where name != '張三'

預期返回id為1的行,結果啥都沒有。
再舉個例子

select * from t2 where name not in (select name from t2 where id!=1)

同樣也是返回空結果集。

2、使用 concat 函數拼接時,首先要對各個字段進行非 NULL 判斷,否則只要任何一個字段為空都會造成拼接的結果為 NULL

比如下面的SQL語句。

SELECT CONCAT("1",NULL);

concat

3、當用count函數進行統計時,NULL 列不會計入統計

img4

4、NULL 列需要更多的存儲空間,一般需要一個額外的字節作為判斷是否為 NULL 的標志位。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM