面試題:對NotNull欄位插入Null值 有啥現象?

賜我白日夢發表於2020-11-12

Hi,大家好!我是白日夢。

今天我要跟你分享的話題是:“對NotNull欄位插入Null值有啥現象?”

一、 推薦閱讀

首發地址:https://mp.weixin.qq.com/s/b30fKiQJTZARZazQdv6WKw

使用推薦閱讀,有更好的閱讀體驗,公眾號首發!分享不易,歡迎關注~

二、從一個實驗開始

首先建立資料表

id為not null型別,我們像下面這樣插入。

所以說預設情況下,如果該列要求不能為null。使用者還往裡面寫入null,就會報錯:cannot be null

當然本篇文章並沒有結束,下面跟大家分享另外一個擴充知識:sql mode 。

這個擴充知識點也是下一篇文章“ 能談談 date、datetime、time、timestamp、year的區別嗎?” 的儲備知識。

三、sql 的執行模式

這就引出了一個 sql_mode 的概念,也就是SQL的執行模式。

預設情況下MySQL會用嚴格模式執行SQL。

你可以像下面這樣檢視MySQL使用了哪些sql mode。

MySQL會根據sql_mode系統變數的值將這些模式不同地應用於不同的客戶端。

使用不同的sql mode執行sql,可能會得到不同的響應結果。

四、做幾個小實驗

為了更直觀的看出sql mode 對sql執行結果的影響,推薦你看一下下面的這兩個小Demo,都不復雜。

Demo1:

建立一張簡單的表 t3,id非空、沒有預設值。

先看看預設的情況下,會有什麼響應!

在預設的sql mode下,執行一條插入空值的語句,發現報錯了

再看看,關閉嚴格的sql mode後會有什麼響應。

關閉嚴格模式後執行的結果如下圖所示。

你會發現這次結果是 wanring + MySQL幫你插入預設值

Demo2:

預設開啟嚴格模式後往int型別的列插入空串(任意串)會報錯。

關閉嚴格模式後,執行下面的SQL會爆出wanrning。

檢視插入的結果

從上面的實驗來看,相信你已經看出了:無論是否開啟了嚴格模式,MySQL都不允許往not null欄位插入null值,它不會因為你插入null,而將null轉成該資料型別的0值。

所謂都嚴格模式,就是將引數 NO_AUTO_CREATE_USER 設定給sql mode

五、需要你瞭解的幾個 sql mode

下面再為大家介紹幾個和日期相關的sql mode。

研發的同學瞭解就好了,不用刻意記住它,瞭解就是加分項!

1、STRICT_TRANS_TABLES:

將其加入到sql_mode之後,MySQL會判斷是否可以直接把使用者給的值插入事務表中,如果不能就中止該語句。對於非事務表,如果該值出現在單行語句或多行語句的第一行中,則中止該語句。

結合上面的例子可以更好的理解STRICT_TRANS_TABLES的作用。


2、NO_ZERO_IN_DATE

將其加入到sql_model之後,MySQL將不允許你將諸如 0000-10-10、2020-00-10、2020-10-00等年份、月份、日期為零的值插入到Date列中。

目前該引數處於目前該引數預設會生效,但是在未來的版本中將會被刪除。


3、NO_ZERO_DATE:

該引數控制MySQL是否允許將 '0000-00-00'作為有效日期。

  • 如果未啟用此模式, '0000-00-00'允許插入不會產生警告。
  • 如果啟用此模式,'0000-00-00' 允許插入且產生警告。
  • 如果啟用了此模式和嚴格模式, '0000-00-00' 插入產生錯誤,除非 IGNORE同樣給出。對於 INSERT IGNOREUPDATE IGNORE'0000-00-00'允許插入且產生警告。

參考:

https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html


六、結語

下一篇文章白日夢將結合本節的 sql mode 同你分享另一個話題:

“能談談 date、datetime、time、timestamp、year的區別嗎?”

為大家帶來MySQL面試專題!本文是第 3 篇、全文110篇!公眾號首發!

以問答的方式,由淺入深的幫你應對各類MySQL面試題的狂轟濫炸!當然也不乏會分享一些高階讀寫分離資料庫中介軟體原理及落地的技術實現,為你揭開資料庫中介軟體神祕的面紗!

面試官都關注了!你還在猶豫什麼呢?

檢視MySQL專題110篇文章大綱:https://mp.weixin.qq.com/s/HTw-Z-SyprYA8bCBZ4NpGQ

相關文章