博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 唯一性索引 (null的特殊性)
阅读量:5256 次
发布时间:2019-06-14

本文共 2221 字,大约阅读时间需要 7 分钟。

写在最前面:

表设计需要注意的事项:唯一性索引的字段中,不建议使用字符型,也建议设置默认不为空。(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是相等的。

转载于:https://www.cnblogs.com/Kid-Zhou/p/8416940.html

你可能感兴趣的文章
《linux c编程指南》学习手记2
查看>>
【poj3690】Constellations 哈希
查看>>
Tomcat中HTTP与AJP区别
查看>>
2017年秋季个人阅读计划
查看>>
c++ class
查看>>
[leetcode]Longest Valid Parentheses
查看>>
Altera Quartus II 12.0订购版下载
查看>>
DON'T SET YOUR SHAREPOINT APP TO FULL TRUST
查看>>
移动端踩坑系列(一)————input默认调用数字键盘
查看>>
第十八次ScrumMeeting会议
查看>>
mysql部分替换
查看>>
IOS关于数据加密(主要为登录加密)想总结的
查看>>
JS中的闭包
查看>>
水仙花数
查看>>
Docker容器技术
查看>>
【同步复制常见错误处理1】当IDENTITY_INSERT设置为OFF时不能向表插入显示值。(源:MSSQLServer,错误码:544)...
查看>>
/var/cache/apt/archives/lock - open
查看>>
01.openssl-基础知识笔记
查看>>
20.openssl编程——椭圆曲线
查看>>
05引用类型——JavaScript高级程序设计(笔记)
查看>>