zoukankan      html  css  js  c++  java
  • 唯一约束 UNIQUE KEY

    什么是唯一约束

    Unique Key:它是 MySQL 中的唯一约束,是指在所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为0001,那么该表中就不能出现另一条记录的 id 值也为0001

    与主键的区别

    Unique KeyPrimary Key 都是 MySQL 中的唯一约束类型,但不同的是,Unique Key 可以有多个字段,而且可以为空,但只能有一个为空,而主键约束则只允许有一个字段,且不能为空。

    创建唯一约束

    我们可以创建多字段唯一约束,例如:

    CREATE TABLE `employee` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `age` int DEFAULT NULL,
      `city` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `UNIQUE_KEY` (`name`,`city`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    

    id 是主键,namecity 是一个组合 Unique_key,现在插入一条数据:

    INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', '北京');
    

    数据结果:

    id name age city
    1 Tom 10 北京

    唯一性验证

    这时候,如果我们再次插入相同namecity的一条数据:

    INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', '北京');
    

    这时候出现了如下报错信息,存在重复键Tom-北京

    [SQL]INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', '北京');
    [Err] 1062 - Duplicate entry 'Tom-北京' for key 'employee.UNIQUE_KEY'
    

    所以,唯一约束起了作用。

    注意:Unique_key 是允许字段为空的。因为 namecity 都没有非空限制,所以,我们可以将它们设置为null

    这里我们需要解释下,Unique_key唯一性是说你不能插入相同的值,但如果你插入的字段其中有null,那么,即使你重复插入,唯一约束也不会起作用!

    例如,我们连续执行以下SQL:

    INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', NULL);
    INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', NULL);
    INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', NULL);
    

    这时候是不会报错的,而且全都插入成功。

    id name age city
    1 Tom 10 NULL
    2 Tom 10 NULL
    3 Tom 10 NULL

    原因:

    主键和唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。

    这里,我们在使用的时候需要特别注意下!

  • 相关阅读:
    【log】AOP配置日志
    【AOP】【log】Spring AOP 完成日志记录
    【java】staitc
    【spring】Spring3注释装配的最佳实践持久层
    【LDA】lda模型和java代码
    【tomcat】tomcat使用jndi,hibernate自动生成的DAO类用了jndi
    【spring】Spring基于 Annotation 的简单介绍
    【bayes】贝叶斯学派和频率学派
    【phi】balance
    【spring】【log】spring mvc 中使用log4j
  • 原文地址:https://www.cnblogs.com/ason-wxs/p/13397559.html
Copyright © 2011-2022 走看看