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

对于列属性:是否为空、默认值的赋值,我们应该先处理默认值,在处理是否为空。其中,默认值的属性值,我们可以选择: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 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值