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是相等的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM