面试题:对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

相关文章
相关标签/搜索