美文网首页mysql
为什么表设计时必须把字段定义为NOT NULL并设默认值

为什么表设计时必须把字段定义为NOT NULL并设默认值

作者: 黎明_dba5 | 来源:发表于2020-04-11 09:53 被阅读0次

空间占用的坑

空’'在存储过程中是不会占用空间的,但是NULL会。就像一个杯子,空表示杯子是真空的,NULL表示装的空气。

mysql> SELECT length('1'),length(NULL),length('');

+-------------+--------------+------------+
| length('1') | length(NULL) | length('') |
+-------------+--------------+------------+
|           1 | NULL         |          0 |
+-------------+--------------+------------+
1 row in set

查询的坑

如果要查询表的NULL需要使用 is null或is not null,如果直接使用=/!=/in/not inl将查询不到值

mysql> SELECT * FROM `user`;
+----+------+-----+---------+
| id | name | age | address |
+----+------+-----+---------+
|  1 | wyf  |  32 | 合肥    |
|  2 | xx   |  31 | 北京    |
|  3 | yy   |  30 | 上海    |
|  4 | zz   |  11 |         |
|  5 | aa   |  21 | NULL    |
+----+------+-----+---------+
5 rows in set

mysql> SELECT * FROM `user` WHERE address IS NULL;
+----+------+-----+---------+
| id | name | age | address |
+----+------+-----+---------+
|  5 | aa   |  21 | NULL    |
+----+------+-----+---------+
1 row in set

mysql> SELECT * FROM `user` WHERE address = NULL;
Empty set

mysql> 

NULL统计的坑

如果使用count()等统计函数,将不会统计NULL。如下,一共有5条数据,统计address就只返回4。

mysql> SELECT * FROM `user`;
+----+------+-----+---------+
| id | name | age | address |
+----+------+-----+---------+
|  1 | wyf  |  32 | 合肥    |
|  2 | xx   |  31 | 北京    |
|  3 | yy   |  30 | 上海    |
|  4 | zz   |  11 |         |
|  5 | aa   |  21 | NULL    |
+----+------+-----+---------+
5 rows in set

mysql> SELECT COUNT(address) FROM `user`;
+----------------+
| COUNT(address) |
+----------------+
|              4 |
+----------------+
1 row in set

mysql> 

索引的坑

Mysql的索引会为NULL值做特殊处理,导致整个索引的查询效率下降。如果是语句中有 is null会使用索引,如果语句中有is not null则会导致索引失效,如下:

查看索引:

mysql> show index from user;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user  |          0 | PRIMARY     |            1 | id          | A         |           5 | NULL     | NULL   |      | BTREE      |         |               |
| user  |          1 | idx_name    |            1 | name        | A         |           5 | NULL     | NULL   | YES  | BTREE      |         |               |
| user  |          1 | idx_address |            1 | address     | A         |           5 | NULL     | NULL   | YES  | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set

is null 会使用索引

mysql> explain select * from user where address is null;
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key         | key_len | ref   | rows | filtered | Extra                 |
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-----------------------+
|  1 | SIMPLE      | user  | NULL       | ref  | idx_address   | idx_address | 1023    | const |    1 |      100 | Using index condition |
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-----------------------+
1 row in set

is not null 不会使用索引

mysql> explain select * from user where address is not null;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | user  | NULL       | ALL  | idx_address   | NULL | NULL    | NULL |    5 |       80 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set

mysql> 

原文链接:https://xiaolyuh.blog.csdn.net/article/details/105427529

相关文章

  • 为什么表设计时必须把字段定义为NOT NULL并设默认值

    空间占用的坑 空’'在存储过程中是不会占用空间的,但是NULL会。就像一个杯子,空表示杯子是真空的,NULL表示装...

  • 我为什么要在MySQL中用NULL

    因为不用NULL的话你就得设默认值,默认值设多少合适是个问题并且二者的意义是不一样的,一个表示有值,值为默认值;一...

  • mysql表设计规范

    1. MySQL建表,字段需设置为非空,需设置字段默认值。 2. Mysql建表,字段尽量不要使用null,需NU...

  • Mysql 的严格模式的 作用

    1.0 不为null的字段不能写入null数据。 2.0 text字段没有默认值 3.0 自增长的字段不能自定义值

  • MySQL核心技术与最佳实践(第4章 表记录更新)

    insert into 表名 [(字段列表)] values (值列表);自增字段可插入null值,默认值约束可以...

  • SQL常用表操作

    本节要点 表的关键信息更改表名更改字段名更改字段类型更改字段NULL值设置更改字段默认值更改主键字段新增字段删除字...

  • 外键约束的参照操作

    1、CASCADE 从父表删除或更新且自动删除或更新子表中匹配的行 2、SET NULL 从父表删除或更新行,并设...

  • mysql 迭代查询所有上级

    表结构为 坑点,表中的主键除id,pid字段,其余字段不能为主键(不明所以,这是目前测出来的坑)即目前表中,只要设...

  • 2019-02-23后端整理

    字段类型 字段的约束 null:如果为True,表示允许为空,默认值是False。blank:如果为True,则该...

  • 2019-02-24

    字段类型 字段的约束 null:如果为True,表示允许为空,默认值是False。blank:如果为True,则该...

网友评论

    本文标题:为什么表设计时必须把字段定义为NOT NULL并设默认值

    本文链接:https://www.haomeiwen.com/subject/lfbemhtx.html