MySQL欄位null和not null學習思考

2021-09-29 07:35:25 字數 1184 閱讀 8286

最近,在開發過程中,建表的時候有個涉及到時間的字段。開始時,使用了not null,default值為0000-00-00 00:00:00。但是有個同事說,這個值很有可能不存在,只有部分情況下才會存在,應當使用null,節省空間。開始時,使用not null的原因也是因為之前的一位前輩說資料庫建表時,所有字段盡量為not null,並且設預設值。然後通過**保證。因此有重新查閱部落格文件了解其原因。

最後的理解是:mysql所有字段盡可能使用not null。最終時間預設值設為1970-01-01 08:00:00,使用這個的原因是該時間對應的時間戳是0。擔心萬一有用到時間戳的地方,0000-00-00 00:00:00對應的時間戳是乙個負數。

對於mysql特殊的注意事項,對於timestamp資料型別,如果往這個資料型別插入的列插入null值,則出現的是當前系統時間,插入空值,則出現0000-00-00 00:00:00。

除非有特別的原因使用null值,應該總是讓字段保持not null。

空值跟null是兩個概念

(1)空值不占用空間

(2)mysql中null其實是占用空間的。

在資料庫裡是嚴格區分的,任何數跟null進行運算都是null, 判斷值是否等於null,不能簡單用=,而要用is null關鍵字。sql語句函式中可以使用ifnull()哈數進行處理,判斷空字串用=''或者<>''來進行處理

含有空值的列很難進行查詢優化,而且對錶索引時不會儲存null值的,所以如果索引字段可以為null,索引的效率會下降很多,因為它們使得索引、索引的統計資訊以及比較運算更加複雜。你應該用0、乙個特殊值或者乙個空串代替null。(影響索引效率的原因:null不是空值,而是要占用空間,所以mysql進行比較的時候,null會參與字段比較,所以對效率有一部分影響。且b樹索引不會儲存null值的,所以如果索引的字段可以為null,索引的效率會下降很多。)

聯表查詢的時候,例如left join table2,如果沒有記錄,則查詢出的table2欄位都是null,加入table2有些字段本身可以是null,那麼除非把table2中not null中的字段查出來,否則就難以區分到底是沒有關聯記錄還是其他情況

資料庫的字段設定not null,僅僅說明該欄位不能為null,只有在插入資料為null的情況下會報錯。

在進行count()統計某列的記錄數的時候,如果採用null值,系統會自動忽略掉,但是空值是會被統計到的。

mysql null特殊的影響和使用:

mysql 判斷字段是否為null

sql中有isnull方法,介紹如下 isnull 使用指定的替換值替換 null。語法isnull check expression replacement value 引數check expression 將被檢查是否為 null的表示式。check expression 可以是任何型別的。re...

mysql預設為null的字段更新規則

mysql中定義為數值型預設為null的字段。假設此欄位名為like,表名為games 此字段上通過語句 update games set like ifnull like,0 1 來更新like欄位的值。1 如果字段 like 的值空的話想通過該更新語句更新like欄位的值將不起作用 同樣如果使用...

MySQL新增欄位和刪除字段

直接在mysql或者mysql工具命令列連線並操作 mysql新增欄位和刪除字段 alter add命令用來增加表的字段。alter add命令格式 alter table 表名 add欄位 型別 其他 例如,在表myclass中新增了乙個欄位passtest,型別為int 4 預設值為0 mysq...