博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL字段null和not null学习思考
阅读量:4170 次
发布时间:2019-05-26

本文共 1093 字,大约阅读时间需要 3 分钟。

最近,在开发过程中,建表的时候有个涉及到时间的字段。开始时,使用了not null,default值为0000-00-00 00:00:00。但是有个同事说,这个值很有可能不存在,只有部分情况下才会存在,应当使用null,节省空间。开始时,使用not null的原因也是因为之前的一位前辈说数据库建表时,所有字段尽量为not null,并且设默认值。然后通过代码保证。因此有重新查阅博客文档了解其原因。

最后的理解是:mysql所有字段尽可能使用not null。最终时间默认值设为1970-01-01 08:00:00,使用这个的原因是该时间对应的时间戳是0。担心万一有用到时间戳的地方,0000-00-00 00:00:00对应的时间戳是一个负数。

对于MYSQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插入的列插入NULL值,则出现的是当前系统时间,插入空值,则出现0000-00-00 00:00:00。

除非有特别的原因使用NULL值,应该总是让字段保持not null。

空值跟NULL是两个概念

(1)空值不占用空间

(2)MYSQL中NULL其实是占用空间的。

在数据库里是严格区分的,任何数跟NULL进行运算都是NULL, 判断值是否等于NULL,不能简单用=,而要用IS NULL关键字。SQL语句函数中可以使用ifnull()哈数进行处理,判断空字符串用=''或者<>''来进行处理

含有空值的列很难进行查询优化,而且对表索引时不会存储NULL值的,所以如果索引字段可以为NULL,索引的效率会下降很多,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊值或者一个空串代替NULL。(影响索引效率的原因:NULL不是空值,而是要占用空间,所以MYSQL进行比较的时候,NULL会参与字段比较,所以对效率有一部分影响。且B树索引不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。)

联表查询的时候,例如LEFT JOIN table2,如果没有记录,则查找出的table2字段都是NULL,加入table2有些字段本身可以是null,那么除非把table2中not null中的字段查出来,否则就难以区分到底是没有关联记录还是其他情况

数据库的字段设置NOT NULL,仅仅说明该字段不能为NULL,只有在插入数据为NULL的情况下会报错。

在进行count()统计某列的记录数的时候,如果采用NULL值,系统会自动忽略掉,但是空值是会被统计到的。

MYSQL NULL特殊的影响和使用:

转载地址:http://eoyai.baihongyu.com/

你可能感兴趣的文章
Java核心技术 卷I 基础知识 学习笔记(5)
查看>>
Java核心技术 卷I 基础知识 学习笔记(6)
查看>>
微服务架构与实践 学习笔记(1)
查看>>
Java核心技术 卷I 基础知识 学习笔记(7)
查看>>
IDEA使用之让maven项目自动依赖jar包
查看>>
Java核心技术 卷I 基础知识 学习笔记(8)
查看>>
Java核心技术 卷I 基础知识 学习笔记(9)
查看>>
Intellij IDEA 创建资源文件夹 source folder
查看>>
Java核心技术卷2 高级特性 学习笔记(1)
查看>>
Java核心技术卷2 高级特性 学习笔记(4)
查看>>
最大乘积
查看>>
最长公共子串
查看>>
codeforces831c 思维
查看>>
CodeForces - 785C Anton and Fairy Tale
查看>>
CodeForces - 831D Office Keys
查看>>
hdu 1258 确定比赛名次
查看>>
hdu 3342 拓扑,是否存在环
查看>>
poj 1860 拓扑。。
查看>>
poj 2553 The Bottom of a Graph 未完
查看>>
inux下如何统计一个目录下的文件个数以及代码总行数(转)
查看>>