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


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



推薦閱讀

  1. 大家常說的基數是什么?(已發布)
  2. 講講什么是慢查!如何監控?如何排查?(已發布)
  3. 對NotNull字段插入Null值有啥現象?(已發布)
  4. 能談談 date、datetime、time、timestamp、year的區別嗎?(已發布)
  5. 了解數據庫的查詢緩存和BufferPool嗎?談談看!(已發布)
  6. 你知道數據庫緩沖池中的LRU-List嗎?(已發布)
  7. 談談數據庫緩沖池中的Free-List?(已發布)
  8. 談談數據庫緩沖池中的Flush-List?(已發布)
  9. 了解臟頁刷回磁盤的時機嗎?(已發布)
  10. 用十一張圖講清楚,當你CRUD時BufferPool中發生了什么!以及BufferPool的優化!(已發布)
  11. 聽說過表空間沒?什么是表空間?什么是數據表?(已發布)
  12. 談談MySQL的:數據區、數據段、數據頁、數據頁究竟長什么樣?了解數據頁分裂嗎?談談看!(已發布)
  13. 談談MySQL的行記錄是什么?長啥樣?(已發布)
  14. 了解MySQL的行溢出機制嗎?(已發布)
  15. 說說fsync這個系統調用吧! (已發布)
  16. 簡述undo log、truncate、以及undo log如何幫你回滾事物! (已發布)
  17. 我勸!這位年輕人不講MVCC,耗子尾汁! (已發布)
  18. MySQL的崩潰恢復到底是怎么回事? (已發布)
  19. MySQL的binlog有啥用?誰寫的?在哪里?怎么配置 (已發布)
  20. MySQL的bin log的寫入機制 (已發布)


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

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

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

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

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


免責聲明!

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



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