首页 > 其他分享 >面试题:对NotNull字段插入Null值 有啥现象?

面试题:对NotNull字段插入Null值 有啥现象?

时间:2022-12-15 13:31:53浏览次数:75  
标签:面试题 null NotNull 00 插入 mode sql MySQL Null

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

今天我要跟你分享的话题是:“对NotNull字段插入Null值有啥现象?”

使用推荐阅读,有更好的阅读体验,公众号首发!分享不易,欢迎关注~

二、从一个实验开始

首先创建数据表

面试题:对NotNull字段插入Null值 有啥现象?_MySQL

id为not null类型,我们像下面这样插入。

面试题:对NotNull字段插入Null值 有啥现象?_MySQL_02

所以说默认情况下,如果该列要求不能为null。用户还往里面写入null,就会报错:cannot be null

当然本篇文章并没有结束,下面跟大家分享另外一个拓展知识:sql mode 。

这个拓展知识点也是下一篇文章“ 能谈谈 date、datetime、time、timestamp、year的区别吗?” 的储备知识。

三、sql 的执行模式

这就引出了一个 sql_mode 的概念,也就是SQL的执行模式。

默认情况下MySQL会用严格模式运行SQL。

你可以像下面这样查看MySQL使用了哪些sql mode。

面试题:对NotNull字段插入Null值 有啥现象?_严格模式_03

MySQL会根据​​sql_mode​​系统变量的值将这些模式不同地应用于不同的客户端。

使用不同的sql mode执行sql,可能会得到不同的响应结果。

四、做几个小实验

为了更直观的看出sql mode 对sql执行结果的影响,推荐你看一下下面的这两个小Demo,都不复杂。

Demo1:

创建一张简单的表 t3,id非空、没有默认值。

面试题:对NotNull字段插入Null值 有啥现象?_sql_04

先看看默认的情况下,会有什么响应!

在默认的sql mode下,执行一条插入空值的语句,发现报错了

面试题:对NotNull字段插入Null值 有啥现象?_严格模式_05

再看看,关闭严格的sql mode后会有什么响应。

关闭严格模式后执行的结果如下图所示。

你会发现这次结果是 wanring + MySQL帮你插入默认值

面试题:对NotNull字段插入Null值 有啥现象?_MySQL_06

Demo2:

默认开启严格模式后往int类型的列插入空串(任意串)会报错。

关闭严格模式后,执行下面的SQL会爆出wanrning。

面试题:对NotNull字段插入Null值 有啥现象?_sql_07

查看插入的结果

面试题:对NotNull字段插入Null值 有啥现象?_sql_08

从上面的实验来看,相信你已经看出了:无论是否开启了严格模式,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 IGNORE​​​和​​UPDATE IGNORE​​​,​​'0000-00-00'​​允许插入且产生警告。


参考:

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

面试题:对NotNull字段插入Null值 有啥现象?_严格模式_09


标签:面试题,null,NotNull,00,插入,mode,sql,MySQL,Null
From: https://blog.51cto.com/u_15311508/5939344

相关文章

  • js对象中过滤掉null, "", undefined无效值
    exportconstfilterParams=(obj)=>{letnewObj={};for(constkeyinobj){//如果对象属性的值不为空,就保存该属性(如果属性的值为0false,保存......
  • 腾讯前端常考vue面试题(必备)
    虚拟DOM的优劣如何?优点:保证性能下限:虚拟DOM可以经过diff找出最小差异,然后批量进行patch,这种操作虽然比不上手动优化,但是比起粗暴的DOM操作性能要好很多,因此虚拟......
  • 前端vue面试题汇总
    常见的事件修饰符及其作用.stop:等同于JavaScript中的event.stopPropagation(),防止事件冒泡;.prevent:等同于JavaScript中的event.preventDefault(),防止执行预设......
  • 一道React面试题把我整懵了
    提问:react项目中的JSX里,onChange={this.func.bind(this)}的写法,为什么要比非bind的func=()=>{}的写法效率高?声明:由于本人水平有限,有考虑不周之处,或者出现错误的,请......
  • C#面试题
    原文链接:https://www.cnblogs.com/xjzh/p/11021893.html1.维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么?答:尽可能用约束(包括CHECK、主键、唯一键......
  • 面试题
    00南京大厂面试题:Shein1.Linux怎么查性能-done答:mpstatlscpu2.linux怎么查端口号是否被占用-done答:netstatanp其中端口listen表示被占用了3.测试方法,因果图,如......
  • dataFrame把某列类型为array<double>或者array<string>数组里的值为null的置换为非nul
    ----把array<double>里的null值转换为0:df.withColumn("Value",replaceArrayNullToZeroUDF(col("Value")))defreplaceArrayNullToNOVALUEUDF=udf(replaceArrayNullToN......
  • Python3 编程面试题
    Pythonglobal语句的作用lambda匿名函数好处Python错误处理Python内置错误类型简述any()和all()方法Python中什么元素为假?提高Python运行效率的方法Pyt......
  • MySQL 面试题总结
    MySQL的面试知识点总结Q1:MySQL的逻辑架构了解吗?第一层是服务器层,主要提供连接处理、授权认证、安全等功能。第二层实现了MySQL核心服务功能,包括查询解析、分析、优......
  • 50个Java面试必问的面试题,我都给你整好了
    ​我们整理了一份主要的Angular面试问题清单,分为三部分:角度面试问题–初学者水平角度面试问题–中级角度面试问题–高级初学者水平–面试问题1.区分Angular和Angula......