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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 今天我要跟你分享的话题是:“对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的写入机制 (已发布)


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
消息中间件 NoSQL Kafka
实时计算 Flink版产品使用合集之在进行全量同步时,有两张表的数据没有正确进入,并且ID字段为null,该怎么处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
存储 JSON BI
关于建表字段是否该使用not null这个问题你怎么看?
V哥分享了在数据库设计中使用 `NOT NULL` 的重要性及应用场景。关键字段如用户名和邮箱应设为 `NOT NULL` 以确保数据完整性;可选字段如中间名和个人资料图片允许 `NULL` 提供更多灵活性。`NULL` 还可用于表示未知状态,如未发货的订单。外键设计需根据业务逻辑决定是否使用 `NOT NULL`。此外,`NOT NULL` 可优化查询性能,但在扩展性和数据兼容性方面,允许 `NULL` 更具优势。结合业务需求和数据统计,合理使用 `NOT NULL` 可确保数据完整性和灵活性。
|
5月前
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
66 7
|
4月前
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
145 0
|
6月前
|
分布式计算 DataWorks 数据可视化
MaxCompute产品使用问题之mongo离线同步导致null的字段不显示该怎么办
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
233 1
|
5月前
|
SQL 存储 索引
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
|
6月前
|
SQL 分布式计算 大数据
MaxCompute产品使用合集之启用hive兼容的时候,某个字段是null,是否会把这个字段当成空白连起来
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
6月前
|
消息中间件 安全 Java
高德面试:为什么Map不能插入null?
在 Java 中,Map 是属于 java.util 包下的一个接口(interface),所以说“为什么 Map 不能插入 null?”这个问题本身问的不严谨。Map 部分类关系图如下: ![image.png](https://cdn.nlark.com/yuque/0/2024/png/92791/1717578225132-241fa833-180d-41ab-95eb-3d7cd1118633.png#averageHue=%233f3424&clientId=u395c5adf-4577-4&from=paste&height=687&id=u98d6a0bc&originHeig
58 1
|
7月前
|
关系型数据库 MySQL 数据库
实时计算 Flink版产品使用合集之使用PostgreSQL作为源时,遇到before字段为NULL该如何处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。