写在最前面:
表设计需要注意的事项:唯一性索引的字段中,不建议使用字符型,也建议设置默认不为空。(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=null;2 -- 结果为:(表示计算机也不知道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是相等的。