MySQL 唯一性索引 (null的特殊性)

表设计需要注意的事项:唯一性索引的字段中,不建议使用字符型,也建议设置默认不为空。(not null)

违反注意事项,可能出现如下的问题:
某张表uni_test 的表结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE `uni_test ` (
`id` BIGINT(20) NOT NULL,
`area_type` INT(11) DEFAULT NULL,
`sys_province_id` BIGINT(20) DEFAULT NULL,
`sys_province_name` VARCHAR(50) DEFAULT NULL,
`sys_city_id` BIGINT(20) DEFAULT NULL,
`sys_city_name` VARCHAR(50) DEFAULT NULL,
`sys_county_id` BIGINT(20) DEFAULT NULL,
`sys_county_name` VARCHAR(50) DEFAULT NULL,
`plat_province_name` VARCHAR(50) DEFAULT NULL,
`plat_city_name` VARCHAR(50) DEFAULT NULL,
`plat_county_name` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_area` (`area_type`,`sys_province_id`,`plat_province_name`,`sys_city_id`,`plat_city_name`,`sys_county_id`,`plat_county_name`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

特意列出唯一性索引的字段:

1
2
3
4
5
6
7
8
9
10
`area_type` INT(11) DEFAULT NULL,
`sys_province_id` BIGINT(20) DEFAULT NULL,
`sys_province_name` VARCHAR(50) DEFAULT NULL,
`sys_city_id` BIGINT(20) DEFAULT NULL,
`sys_city_name` VARCHAR(50) DEFAULT NULL,
`sys_county_id` BIGINT(20) DEFAULT NULL,
`sys_county_name` VARCHAR(50) DEFAULT NULL,
`plat_province_name` VARCHAR(50) DEFAULT NULL,
`plat_city_name` VARCHAR(50) DEFAULT NULL,
`plat_county_name` VARCHAR(50) DEFAULT NULL,

插入了两条数据

1
2
3
4
area_type  sys_province_id  plat_province_name  sys_city_id  plat_city_name  sys_county_id  plat_county_name  
--------- --------------- ------------------ ----------- -------------- ------------- ------------------
4 320000 (NULL) 320800 (NULL) 320803 淮安县
4 320000 (NULL) 320800 (NULL) 320803 淮安县

可以从以上结果发现,除去两个为空的列,其他的数据都是一致的(排除带有空格的字符串影响)

– 另外的解释:
null在MySQL中的特殊性可以说是MySQL无法识别的唯一性,
1 select null=null;
2 – 结果为:(表示计算机也不知道null与null之间是否相等)
3 null=null
4 ———–
5 (NULL)