MySQL:关于 null 的那些事


#MySQL 笔记


NULL 的判等

NULL 与唯一索引

NULL 会让唯一索引无法保证唯一性。

MySQL:唯一索引与NULL

NULL 与 count 计数

count 某一个列时,会忽略null的数据。

用一个真实的表做例子:

USE test;
CREATE TABLE `test_table` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name1` varchar(32) DEFAULT NULL COMMENT '名字1',
  `name2` varchar(32) DEFAULT NULL COMMENT '名字2',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

插入数据:

insert into test_table(name1, name2) values('letian', 'letian');
insert into test_table(name1, name2) values('letian', 'letianbiji');
insert into test_table(name1, name2) values('letian', null);
insert into test_table(name1, name2) values(null, null);

查询:

mysql> select * from test_table;
+----+--------+------------+
| id | name1  | name2      |
+----+--------+------------+
| 1  | letian | letian     |
| 2  | letian | letianbiji |
| 3  | letian | <null>     |
| 4  | <null> | <null>     |
+----+--------+------------+

mysql> select count(*) from test_table;
+----------+
| count(*) |
+----------+
| 4        |
+----------+

mysql> select count(id), count(name1), count(name2) from test_table;
+-----------+--------------+--------------+
| count(id) | count(name1) | count(name2) |
+-----------+--------------+--------------+
| 4         | 3            | 2            |
+-----------+--------------+--------------+

concat

concat 函数会将多个参数连接成字符串。若有一个参数为 null,结果则为 null。

mysql> select concat(1,2,3)
+---------------+
| concat(1,2,3) |
+---------------+
| 123           |
+---------------+

mysql> select concat('1','2')
+-----------------+
| concat('1','2') |
+-----------------+
| 12              |
+-----------------+

mysql> select concat(1,2,null)
+------------------+
| concat(1,2,null) |
+------------------+
| <null>           |
+------------------+

尽量不要用 NULL

允许 null 值时:

  1. 可能导致唯一索引不符合预期。
  2. 一些 业务SQL 会变的复杂,要考虑是 null 的场景,也要考虑非 null 的场景。

简单说,不允许为 null 时,很多处理会变得更简单。



( 本文完 )