zoukankan      html  css  js  c++  java
  • 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是相等的。
  • 相关阅读:
    ES6解构赋值
    ES6兼容
    ES6关键字
    ES6模板字符串
    Bootstrap面试题
    Javascript中类型转换的情况以及结果
    事件
    ES6 解构赋值
    ES6 基础(let const)
    数组与字符串常用方法
  • 原文地址:https://www.cnblogs.com/Kid-Zhou/p/8416940.html
Copyright © 2011-2022 走看看