-
2021-03-09 14:17:29
import org.jetbrains.annotations.NotNull;
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>20.1.0</version>
</dependency>待续......
更多相关内容 -
领导含泪叮嘱我:MySQL 建表字段记得用 not null,不然就收拾包袱滚蛋
2021-05-27 16:30:23上午我收到一条短信,内容是“尊敬的 null 你好,XXX”,当时我就笑了。真是外行看热闹,内行看门道,这是程序员都能 Get 的笑点,说明程序没有正确从数据库获取到我的姓名,然后把空值格式化为了 null。小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL江湖路 | 专栏目录
上午我收到一条短信,内容是
“尊敬的 null 你好,XXX”
,当时我就笑了。真是外行看热闹,内行看门道,这是程序员都能 Get 的笑点,说明程序没有正确从数据库获取到我的姓名,然后把空值格式化为了 null。我仿佛看到了那个程序员小姐姐被喷的场景,那是个温暖的午后,明媚的阳光洒在办公桌旁,小姐姐正撸着自己的代码,突然… …“啪啪啪!!别睡了哈哥,老板叫你过去开会!” 我c…
言归正传,出现这种情况的原因一般是数据库的数据问题造成的,我大胆猜测几种场景,同学们可以在评论区补充~~
- 首次名称入库时出错,把我的名称填写失败,MySQL默认成 null 值,查询时格式化成了’null’字符串;
- 我注册时故意在名称中加了
\n、\r
等下流的数据,导致查询时返回了空字符串’’,正则校验时又出现空指针; - 我把id设置为’null’(
别,兄弟们,我还能这么无聊了?~~
)
在 MySQL 中,NULL 表示未知的数据,我们在设计表时,常常有老司机告诉我们:
字段尽可能用NOT NULL,而不是NULL,除非有特殊情况!
但却都只给结论也不说明原因,就像喝鸡汤不给勺子一样,有点膈应,让不少同学对这些结论只知其一,不明其二。坦白说,老司机也不一定清楚为啥,可能就是他领导让他这么干而已~~
就像我领导,记得我刚来公司时,他语重心长的叮嘱我:
MySQL 建表字段记得用 not null,不然就滚蛋!🙃🙃🙃
今天我就带你来弄清楚为啥建议你建表字段尽量都使用
not null
,记得三连哦~先看看
MySQL 官网文档
提到 NULL 的地方:NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL columntakes one bit extra, rounded up to the nearest byte.
翻译官:
NULL列在行中需要额外的空间以记录其值是否为NULL。 对于MyISAM表,每个NULL列都多花一位,四舍五入到最接近的字节。
其实这是官方在委婉的告诉你,别用NULL就完了~~下面我们来看看NULL值有多少坑,这里我会结合 NULL 字段,和你着重说明 sum 函数、count 函数,以及查询条件为 NULL 值时可能踩的坑。
先给出我们的测试表:
mysql> select * from demo0527; +----+------------+-------+------+ | id | name | money | age | +----+------------+-------+------+ | 1 | 陈哈哈1 | 100 | NULL | | 2 | 陈哈哈2 | NULL | NULL | | 3 | NULL | 100 | NULL | +----+------------+-------+------+ 3 rows in set (0.00 sec)
我们通过下面三个用例,结合数据库中表
demo0527
的 null 值来看看:- 示例一:通过 sum 函数统计一个只有 NULL 值的列的总和,比如 SUM(age);
- 示例二:select 记录数量,count 使用一个允许 NULL 的字段,比如 COUNT(name);
- 示例三:使用
=NULL
条件查询字段值为 NULL 的记录,比如 money=null 条件。
以上三个示例对应的测试SQL如下:
SELECT SUM(age) from demo0527; SELECT count(name) from demo0527; SELECT * FROM demo0527 WHERE money=null;
查询结果:
mysql> SELECT SUM(age) from demo0527; +----------+ | SUM(age) | +----------+ | NULL | +----------+ 1 row in set (0.00 sec) mysql> SELECT count(name) from demo0527; +-------------+ | count(name) | +-------------+ | 2 | +-------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM demo0527 WHERE money=null; Empty set (0.00 sec)
得到的结果,分别是
NULL、2、空List
;显然,这三条 SQL 语句的执行结果和我们的期望不同:- 虽然表中的 age 都是 NULL,但 SUM(age) 的结果应该是 0 才对;
- 虽然第三行记录的 name 是 NULL,但查记录总行数应该是 3 才对;
- 使用
money=NULL
并没有查询到 id=2 的记录,查询条件失效。
三个示例的原因分别是:
MySQL 中 sum 函数没统计到任何记录时,会返回 null 而不是 0
,可以使用 IFNULL(null,0) 函数把 null 转换为 0;在MySQL中使用count(字段),不会统计 null 值
,COUNT(*) 才能统计所有行;MySQL 中使用诸如 =、<、> 这样的算数比较操作符比较 NULL 的结果总是 NULL
,这种比较就显得没有任何意义,需要使用 IS NULL、IS NOT NULL 或 ISNULL() 函数来比较。有兴趣的同学可以看一下《有意思,原来SQL中的NULL是这么回事儿》
让我们根据上述原因来相应修改一下 SQL:
SELECT IFNULL(SUM(age),0) FROM demo0527; SELECT COUNT(*) FROM demo0527; SELECT * FROM demo0527 WHERE age IS NULL;
修改后我们查询的结果就是我们想要的了:
mysql> SELECT IFNULL(SUM(age),0) FROM demo0527; +--------------------+ | IFNULL(SUM(age),0) | +--------------------+ | 0 | +--------------------+ 1 row in set (0.00 sec) mysql> SELECT COUNT(*) FROM demo0527; +----------+ | COUNT(*) | +----------+ | 3 | +----------+ 1 row in set (0.00 sec) mysql> SELECT * FROM demo0527 WHERE age IS NULL; +----+------------+-------+------+ | id | name | money | age | +----+------------+-------+------+ | 1 | 陈哈哈1 | 100 | NULL | | 2 | 陈哈哈2 | NULL | NULL | | 3 | NULL | 100 | NULL | +----+------------+-------+------+ 3 rows in set (0.00 sec)
另外值得注意的是,不仅
money=NULL
条件查不到字段值为 NULL 的记录,当我们使用SELECT * FROM demo0527 WHERE money <>100;
来查询id=2这行时,也是查不到任何数据的。我们在工作中往往会在这里栽跟头,导致统计不准确,给大家Mark一下
。mysql> SELECT * FROM demo0527 WHERE money <>100; Empty set (0.02 sec)
可见MySQL库中的NULL值很容易导致我们在统计、查询表数据时出错,这里有些同学可能会问有没有性能上的提升,算不算SQL优化,其实把NULL列改为NOT NULL带来的性能提升可以忽略,除非确定它带来了问题,否则不需要把它当成优先的优化措施。
好了,多了就不说了,我劝你耗子尾汁,但推荐你关注我,因为我会让你在快乐中学会很多东西!
MySQL系列文章汇总与《MySQL江湖路 | 专栏目录》
往期热门MySQL系列文章
: -
详解mysql NULL和 IS NOT NULL以及空字符串
2021-12-21 17:43:08mysql、NULL 和 空字符串的区别,怎样理解NULL 这个字段1、NULL 和 空字符串的区别
"NULL" 表示的是一种数据类型,表示未知
" " 空字符串的数据类型是字符串,只是这个字符串比较特殊,什么都没有
怎么理解这个NULL呢?其实就把它当做是一种叫 未知的数据类型 来理解就好了。
2、NULL值查询效率
NULL 其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。并且对表索引时是不会存储NULL值的,所以如果索引的字段为NULL时,索引的效率会下降很多,因此我们设置某个字段类型时尽量不要设置NULL
3、判断一个字段是否为空,应该怎么查询
首先建立user表,填入以下数据:
下面我们执行以下sql查询
# 查询 name 为空的数据 SELECT * FROM `user` WHERE name = NULL; SELECT * FROM `user` WHERE name IS NULL; SELECT * FROM `user` WHERE name = ''; SELECT * FROM `user` WHERE name IS NULL OR `name`=''; # 查询 name 不为空的数据 SELECT * FROM `user` WHERE name IS NOT NULL; SELECT * FROM `user` WHERE name <> NULL;
SELECT * FROM `user` WHERE name = NULL; 结果1:
SELECT * FROM `user` WHERE name IS NULL; 结果2:
SELECT * FROM `user` WHERE name = ' '; 结果3:
SELECT * FROM `user` WHERE name IS NULL OR `name`=' '; 结果4:
SELECT * FROM `user` WHERE name IS NOT NULL; 结果5:
SELECT * FROM `user` WHERE name <> NULL; 结果6:
从查询结果可以得出:
1、使用 IS NULL 查出的是 字段为 未知类型的数据
2、使用IS NOT NULL 查出的是 字段不是 未知类型的数据
3、使用 IS NULL OR `name`=' ' 查询的是 未知类型和空字符串类型的数据
总之,我们只要把 NULL 当做是一种数据类型就很好理解这个字段了
-
oracle之is null和is not null的优化
2021-05-07 13:24:25oracle之优化is null语句一:is null的优化方法:通过nvl(字段,j)=j的方式,将字段中为空的数据转化为j,从而正常使用索引。具体实现条件则是:i is null <===> j = nvl(i,j);注意:使用时必须要确保字段的数据...oracle之优化is null语句
一:is null的优化
方法:通过nvl(字段,j)=j的方式,将字段中为空的数据转化为j,从而正常使用索引。
具体实现条件则是:i is null <===> j = nvl(i,j);
注意:使用时必须要确保字段的数据不包含j,例如:(age,15)=15,此时有可能age
内容是15,此时不可以,j的值要变换,保证不再age的范围之内。
函数介绍:
nvl(a,b,c.......):当a为空时取b,当b为空时取c,以此类推。
当然还有另外一种方式解决这个问题:将null包含到索引中
--使用nvl函数的方式(不用添加索引,推荐)
select * from student t where 1=nvl(t.age,1);
--当t.age不存在等于1的数据时等价于
--select * from student t where t.age is null;
--添加索引的方式
create index idx_age_x on tab_i(decode(age,null,1));
select * from student t where decode(t.age,null,1)=1;
二:is not null的优化
方法:结果集不包含j = nvl(i,j)即可
通常情况下使用not exists或者比较大小
示例:
1:not exists
select * from student t where not exists
(select 1 form student s where 1=nvl(s.age,1));
--11g版本后not in和not exists趋于相似,也可以用not in
--当t.col_x不存在等于1的数据时等价于
--select * from student t where t.age is not null;
2:比较大小
--当t.age为总是大于1的数值时
select * from student t where 1
--当t.age为总是小于1的数值时
select * from student t where 1>nvl(t.age,1);
--直接比较大小,暗含了 IS NOT NULL
select * from student t where t.age>1;
3:比较长度
--当t.age的长度总是大于1时
select * from student t where 2<=length(nvl(t.age,1));
--因为length函数的参数为空时,其结果为空,因而不能直接使用length函数
参考链接:
https://blog.csdn.net/qq_38880340/article/details/84290900
-
关于@NotNull 注解中groups 的作用
2020-05-29 16:20:39我就想问一下 我知道这个@NotNull是校验为不为空得东西,我想知道的是里面得groups 定义是有什么作用,GroupInterface1这个类应该是自定义的类,他是很普通得实体类,还是说里面定义得特殊方法,看了好多都没有说明... -
MySQL之is not null, not in优化
2021-11-26 09:08:35代替 (not in 进行 子查询):将子查询 转变为 表连接,相关的逻辑写在 表连接 的关系...代替 (is not null):将 is not null 的字段,使用 ifnull()替换为其他值,然后 ifnull()!=其他值,就能进行筛选了 ... -
MySQL中建表时可空(NULL)和非空(NOT NULL)的用法详解
2020-10-22 16:04:07MySQL中建表时可空(NULL)和非空(NOT NULL)的用法详解 MySQL不推荐列默认值设置为null到底是为什么 参考资料: https://blog.csdn.net/qq_30549099/article/details/107395521 ...必须把字段定义为NOT NULL并且... -
数据库字段为什么要使用NOT NULL
2021-04-12 15:23:39目前大部分的开发都会把字段全部设置成NOT NULL并且给默认值。通常,对于默认值一般这样设置: 整形,我们一般使用0作为默认值。 字符串,默认空字符串 时间,可以默认1970-01-01 08:00:01,或者默认 0000-00-00 0 -
@NotNull注解不生效
2022-01-15 20:15:52进行参数校验的时候,加了@NotNull注解,@Validated注解和@Valid注解,但是参数校验的时候不生效。 最后发现是因为我的Spring-boot版本较高,后面不需要引入validation-api,hibernate-validator这种依赖,直接引入... -
SQL语句中is not null 和 is null 关键字的优化
2022-01-11 08:42:25当我们多表join查询时如果添加某个字段is null 或者is not null 关键字时会造成sql的执行速度大幅下降,就像下图一样 不使用is not null 的情况下时 那么对于sql中is not null 可以做这样的一个替换 对于mySql: ... -
springboot注解@NotNull,@NotBlank,@Valid自动判定空值
2021-03-06 15:03:55三、常用的校验注解 javax.validation.constraints.NotNull @Null 被注释的元素必须为null @NotNull 被注释的元素不能为null @AssertTrue 被注释的元素必须为true @AssertFalse 被注释的元素必须为false @Min... -
字符创函数 not null AUTO_INCREMENT字段约束
2021-02-27 21:08:50MySQL字段约束-索引-外键 字段修饰符 (约束) NULL和NOT NULL修饰符 null和not null 创建带修饰符的表,测试null和not null字段区别 mysql> use HA; #使用HA数据库 mysql> create table worker(id int not null,name... -
postgresql 去除或添加 not null约束
2020-09-21 20:01:56去除 not null 约束 alter table table_name alter column_name drop not null; 添加not null 约束 alter table table_name alter column_name set not null; -
【Hive SQL】is not null之后还是存在空值
2020-07-22 15:46:42这是因为数据在数据库中格式可能为‘’,因此可以加一个条件: where length(trim(col)) = 0 另外,Hive SQL中NULL和‘’有所不同: where length(NULL),length('') ->NULL,0 -
自定义注解实现@NotNull注解
2019-06-17 14:45:30NotNull notNull = field.getAnnotation(NotNull.class); throw new IllegalArgumentException(notNull.fileName() + " 不能为空"); } // 如果是 list 则应该判断 list 长度. if (invoke != null && invoke.... -
@NotNull注解放在实体类或者Controller层不生效解决方案
2022-05-13 23:42:00在日常开发过程中,我们会写一些注解于加在java的实体类属性字段上,或者放到controller层的方法参数中,在进请求或请求的时候会根据字段的注解进对应的校验,简化校验相关的代码。...2、当@NotNull等注解写在Contr. -
java 校验注解之 @NotNull、@NotBlank、@NotEmpty
2021-04-30 10:04:15实体字段校验 @NotNull、@NotEmpty、@NotBlank 1.@NotNull 不能为 null,但可以为 empty,一般用在 Integer 类型的基本数据类型的非空校验上,而且被其标注的字段可以使用 @size、@Max、@Min 对字段数值进行... -
java的@NotNull怎么用
2021-07-07 15:15:48使用说明 XXXreq{ @NotNull(message = "XXX不能为空") private Integer xxxx=0; } public ApiResponse getXXXXXX(@RequestBody @Valid XXRequest request) { } -
postgresql 数据库 alter table alter column set not null 的一些实践
2020-03-12 21:14:26创建表后,有时需要对表进行 set not null 或者 set null 设置。 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) # # su - postgres $ $ psql -c "select version();" ... -
NOT NULL constraint failed:
2019-05-06 12:53:16Django创建表格并迁移以后使用django shell创建了一些数据,再通过create函数创建数据时遇到NOT NULL constraint failed: 请帮我看一下吧 这是我的模型 ``` from django.db import models # Create your ... -
Spring中@NotNull注解@Valid注解简介及使用
2020-04-29 17:36:50目录 前言 @NotNull使用步骤 问题 其他注解 前言 在开发中,为了代码的稳定性不报空指针异常,经常需要判断前端传过来的值是否为空,为空的话就返回前端值为空的提示,才能进行下一步的操作,例如登录操作需要判断传... -
@NotNull 等注解的简单使用
2020-07-23 11:35:49注册一个账号, 有账号+...前端会做一个判空,但是后端同时也要做一个判空,防止url直接访问 这时后端的代码通常是: if(name!=null){ ... } else if(password!=null){ ...这时候就要用到一个注解@NotNull ... @NotNull(message = -
mysql中IS NULL、IS NOT NULL不能走索引?
2020-08-03 16:34:23mysql中IS NULL、IS NOT NULL不能走索引? 不知道是啥原因也不知道啥时候, 江湖上流传着这么一个说法 mysql查询条件包含IS NULL、IS NOT NULL、!=、like %* 、like %*%,不能使用索引查询,只能使用全表扫描。 刚入行... -
SQL NOT NULL约束
2020-06-08 18:14:30SQL NOT NULL约束 一、 说明 本文主要讲一下,SQL的NOT NULL(不为空)约束相关内容。 二、 所用工具 SQL 数据库 三、 内容 1. SQL NOT NULL约束的作用 主要规定表中的数据必须遵守一定的规则,如果存在违反约束的数据... -
@NotNull 不生效,解决
2021-06-21 12:59:13@NotNull :不能为null .但可以为empty @NotEmpty:不能为null,而且长度必须大于0 @NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0 在这些注解使用时,需要搭配 @Valid使用,否则,将... -
关于入参校验@NotNull注解的使用
2021-03-17 10:35:07//权益类型 1:券 2:品牌积分 @NotNull(message = "权益类型不可为空") @Pattern(regexp = "[12]",message = "权益类型参数值不正确") private String giftType ; @NotBlank:主要用于校验字符串是否为空串或null,... -
null与not null和null与空值''的区别
2019-05-29 20:27:23相信很多用了MySQL很久的人,对这两个字段属性...2.为毛not null的效率比null高 3.判断字段不为空的时候,到底要 select * from table where column <> '' 还是要用 select * from table wherecolumn is not ... -
MySQL中IS NULL、IS NOT NULL、!=是否走索引
2019-08-23 10:12:39MySQL的WHERE子句中包含 IS NULL、IS NOT NULL、!= 这些条件时便不能使用索引查询,只能使用全表扫描。 这种说法愈演愈烈,甚至被很多同学奉为真理。咱啥话也不说,举个例子。假如我们有个表s1,结构如下: ... -
Mysql中is null 和 is not null的使用
2020-03-17 16:51:28MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能...IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。 <=>: 比较操作符(不同于 = 运算符)... -
MySQL ‘IN‘ ‘IS NULL‘ ‘IS NOT NULL‘ 到底走不走索引
2021-08-05 15:22:04看了很多篇文章,关于走不走索引这个问题真是众说纷纭,不如自己实践一波来得准。 先说我的mysql版本为5.7; 再说结论:有时候走,有时候不走。... `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `nam