对NotNull字段插入Null值有啥现象?

1从一个小实验开始

首先创建数据表,只有1列id、没有默认值,且不能为Null

然后我们像下面这样尝试插入一条SQL。

你会发现,本篇的问题答案已经有了:默认情况下,如果该列要求不能为null。用户还往里面写入null,就会报错:cannot be null

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

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

2sql的执行模式

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

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

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

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

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

3通过实验测试sql mode

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

实验一:

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

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

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

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

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

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

实验二:

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

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

查看插入的结果

从上面的实验来看,相信你已经看出了现象:无论是否开启了严格模式,MySQL都不允许往not null字段插入null值,它不会因为你插入null,而将null转成该数据类型的0值。

所谓都严格模式,就是将参数 NO_AUTO_CREATE_USER 设置给sql mode

3需要你了解的几个 sql mode

下面再为大家介绍几个常见或者和日期相关的sql mode。

研发的同学了解就好了,不用刻意记住它,了解就是加分项!

1、STRICT_TRANS_TABLES

将其加入到sql_mode之后,MySQL会判断是否可以直接把用户给的值插入事务表中,如果不能就中止该语句。对于非事务表,如果该值出现在单行语句或多行语句的第一行中,则中止该语句。

结合上面的例子可以更好的理解STRICT_TRANS_TABLES的作用。

2、NO_ZERO_IN_DA****TE

将其加入到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'允许插入且产生警告。

4结语

本文到这里就行将结束了,主要跟大家分享一个 sql mode 拓展知识点。

作为研发同学的你了解就好了,如果没时间去实际操作一下就看下我上面的小Demo。不积跬步,无以至千里。

全部评论
看来是我把事情想简单了
点赞 回复 分享
发布于 2022-08-17 20:13 陕西

相关推荐

不愿透露姓名的神秘牛友
05-20 16:14
已编辑
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git commit,不会git pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗? 哪怕是一个swap函数,开源项目里都经常注释:1 3 5 7 9 2 4 6 8 10^           ^l              rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1. 部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go…… 结果满脸懵的说ts是什么……我让看agent loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务