面試題:對NotNull字段插入Null值 有啥現象?

Hi,你們好!我是白日夢。html

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

1、 推薦閱讀

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

面試

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

2、從一個實驗開始

首先建立數據表數據庫

id爲not null類型,咱們像下面這樣插入。code

因此說默認狀況下,若是該列要求不能爲null。用戶還往裏面寫入null,就會報錯:cannot be nullhtm

固然本篇文章並無結束,下面跟你們分享另一個拓展知識:sql mode 。中間件

這個拓展知識點也是下一篇文章「 能談談 date、datetime、time、timestamp、year的區別嗎?」 的儲備知識。blog

3、sql 的執行模式

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

默認狀況下MySQL會用嚴格模式運行SQL。

你能夠像下面這樣查看MySQL使用了哪些sql mode。

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

使用不一樣的sql mode執行sql,可能會獲得不一樣的響應結果。

4、作幾個小實驗

爲了更直觀的看出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

5、須要你瞭解的幾個 sql mode

下面再爲你們介紹幾個和日期相關的sql mode。

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

一、STRICT_TRANS_TABLES:

將其加入到sql_mode以後,MySQL會判斷是否能夠直接把用戶給的值插入事務表中,若是不能就停止該語句。對於非事務表,若是該值出如今單行語句或多行語句的第一行中,則停止該語句。

結合上面的例子能夠更好的理解STRICT_TRANS_TABLES的做用。


二、NO_ZERO_IN_DATE

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

目前該參數處於目前該參數默認會生效,可是在將來的版本中將會被刪除。


三、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


6、結語

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

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

爲你們帶來MySQL面試專題!本文是第 3 篇、全文110篇!公衆號首發!

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

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

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

相關文章
相關標籤/搜索