寫在最前面:
表設計需要注意的事項:唯一性索引的字段中,不建議使用字符型,也建議設置默認不為空。(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是相等的。