欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

由 MySQL 的列属性(即字段属性):是否为空、默认值,的赋值问题所引发的思考。

程序员文章站 2022-03-25 18:45:39
...

对于列属性:是否为空、默认值的赋值,我们应该先处理默认值,在处理是否为空。其中,默认值的属性值,我们可以选择:1、无(默认,即不对该属性赋值的情况下);2、NULL;3、CURRENT_TIMESTAMP;4、自定义(即根据实际,自行设置,如:0,'')。

对于一张表(拥有至少两个列),我们在插入一条数据的时候,如果不想给某个列赋值,下面有几种办法:

  • 设置【默认值】属性为预期的值;
  • 设置【自增】属性为是;
  • 设置【是否为空】属性设为是(注意:这个设置会连带地,将【默认值】属性设为 NULL。所以,根据实际,还得处理【默认值】属性的赋值问题。);

关于 NULL

  • 首先,我们要搞清楚 “ 空值(即 '') ”  和  “ NULL ”  的概念:

MySQL官方关于 NULL 的解释:

NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.

空值是不占用空间的;MySQL中的NULL其实是占用空间的。打个比方来说,有一个杯子,空值 代表杯子是真空的,NULL 代表杯子中装满了空气。

所以,当列不可为空时,我们可以插入一条数据(该数据在该列的值为空)。这里面,我们得抛开——在开启数据库验证的情况。

数据库的字段ID设为 NOT NULL,仅仅说明该字段不能为 NULL,也就是说只有在

INSERT INTO table(ID) VALUES(NULL);

这种情况下数据库会报错,而

INSERT INTO table(ID) VALUES('');

这不能说明是 NULL, 数据库系统会根据ID设的缺省值填充,或者如果是自增字段就自动加一等缺省操作。

任何数跟 NULL 进行运算都是 NULL 。判断值是否等于 NULL,不能简单用 =,而要用 IS NULL 关键字

SELECT * FROM `test` WHERE col1 IS NOT NULL

判断不为空值的情况:

SELECT * FROM `test` WHERE col1 <> ''
  • NULL 对索引的影响

MySQL 在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。

而且,B树索引是不会存储 NULL 值的,所以如果索引的字段可以为 NULL,索引的效率会下降很多。所以,如果引用索引列的话,最好使用【是否为空】属性去约束一下,防止该使用索引而不使用的情况发生。

1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或 B-树、B_树

  • 总结

尽量避免 NULL:应该指定列为 NOT NULL(即列属性【是否为空】设置为否),除非对于该行的列值为 NULL 。