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

写在最前面:

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

 

违反注意事项,可能出现如下的问题:
某张表uni_test 的表结构:
 1 CREATE TABLE `uni_test ` (
 2   `id` BIGINT(20)  NOT NULL,
 3   `area_type` INT(11) DEFAULT NULL,
 4   `sys_province_id` BIGINT(20) DEFAULT NULL,
 5   `sys_province_name` VARCHAR(50) DEFAULT NULL,
 6   `sys_city_id` BIGINT(20) DEFAULT NULL,
 7   `sys_city_name` VARCHAR(50) DEFAULT NULL,
 8   `sys_county_id` BIGINT(20) DEFAULT NULL,
 9   `sys_county_name` VARCHAR(50) DEFAULT NULL,
10   `plat_province_name` VARCHAR(50) DEFAULT NULL,
11   `plat_city_name` VARCHAR(50) DEFAULT NULL,
12   `plat_county_name` VARCHAR(50) DEFAULT NULL,
13   PRIMARY KEY (`id`),
14   UNIQUE KEY `ux_area` (`area_type`,`sys_province_id`,`plat_province_name`,`sys_city_id`,`plat_city_name`,`sys_county_id`,`plat_county_name`)
15 ) ENGINE=INNODB DEFAULT CHARSET=utf8;

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

  `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 area_type  sys_province_id  plat_province_name  sys_city_id  plat_city_name  sys_county_id  plat_county_name  
2 ---------  ---------------  ------------------  -----------  --------------  -------------  ------------------        
3         4           320000  (NULL)                   320800  (NULL)                 320803  淮安县         
4         4           320000  (NULL)                   320800  (NULL)                 320803  淮安县
可以从以上结果发现,除去两个为空的列,其他的数据都是一致的(排除带有空格的字符串影响)
 
-- 另外的解释:
null在MySQL中的特殊性可以说是MySQL无法识别的唯一性,
1 select null=null2 -- 结果为:(表示计算机也不知道null与null之间是否相等)
3 null=null  
4 -----------
5      (NULL)

 

 

补充:
1.在SQL中逻辑表达式的可能值包括 true 、false、unknown(这个是sql中特有的状态,可以理解为计算机说我也不知道)。
一般情况下,我们将任何值(包括null本身)与null做比较的时候,都会返回null。
2.在查询表达式中 比如where 和having,unknown会视为false。所以
  SELECT * FROM   `dbtest`.`uni_test` WHERE plat_province_name=NULL; 这样是查不出来结果的,需要改成is null。
3.在分组子句与排序子句中,sql视null是相等的。

posted on 2018-02-05 11:46  Kid_Zora  阅读(7076)  评论(0编辑  收藏  举报

导航