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

  • 2020 年 11 月 12 日
  • 筆記

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

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

一、 推薦閱讀

首發地址://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'允許插入且產生警告。

參考:

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

六、結語

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

「能談談 date、datetime、time、timestamp、year的區別嗎?」

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

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

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

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