作用

用来限制某个字段/某列的值不能重复。
image.png

关键字

UNIQUE

特点

  • 同一个表可以有多个唯一约束。
  • 唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
  • 唯一性约束允许列值为空。
  • 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同
  • MySQL会给唯一约束的列上默认创建一个唯一索引。

    添加唯一约束

    创建表时

    ```sql CREATE TABLE test2( id INT UNIQUE, #列级约束 last_name VARCHAR(15) , email VARCHAR(25), salary DECIMAL(10,2),

    表级约束

    CONSTRAINT uk_test2_email UNIQUE(email) );

    uk_test2_email为约束别名

    在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。

    desc test2;

INSERT INTO test2(id,last_name,email,salary) VALUES(1,’Tom’,’tom@126.com’,4500);

id重复

错误: Duplicate entry ‘1’ for key ‘id’

INSERT INTO test2(id,last_name,email,salary) VALUES(1,’Tom1’,’tom1@126.com’,4600);

email重复

错误:Duplicate entry ‘tom@126.com’ for key ‘uk_test2_email’

INSERT INTO test2(id,last_name,email,salary) VALUES(2,’Tom1’,’tom@126.com’,4600);

可以向声明为unique的字段上添加null值。而且可以多次添加null

INSERT INTO test2(id,last_name,email,salary) VALUES(2,’Tom1’,NULL,4600);

INSERT INTO test2(id,last_name,email,salary) VALUES(3,’Tom2’,NULL,4600);

SELECT * FROM test2;

  1. <a name="I3ttg"></a>
  2. ## 在alter table时
  3. ```sql
  4. DESC test2;
  5. UPDATE test2
  6. SET salary = 5000
  7. WHERE id = 3;
  8. #方式1:
  9. # 原表中salary数据不允许有重复值,否则执行报错!!!
  10. ALTER TABLE test2
  11. ADD CONSTRAINT uk_test2_sal UNIQUE(salary);
  12. #方式2:
  13. ALTER TABLE test2
  14. MODIFY last_name VARCHAR(15) UNIQUE;

字段列表中如果是一个字段,表示该列的值唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的 方式1: alter table 表名称 add unique key(字段列表);

方式2: alter table 表名称 modify 字段名 字段类型 unique;

复合的唯一性约束

  1. CREATE TABLE USER(
  2. id INT,
  3. `name` VARCHAR(15),
  4. `password` VARCHAR(25),
  5. # 两个字段合在一起建立唯一性约束
  6. # 表级约束
  7. CONSTRAINT uk_user_name_pwd UNIQUE(`name`,`password`)
  8. );
  9. INSERT INTO USER
  10. VALUES(1,'Tom','abc');
  11. #可以成功的:
  12. INSERT INTO USER
  13. VALUES(1,'Tom1','abc');
  14. SELECT *
  15. FROM USER;

删除唯一约束

  • 添加唯一性约束的列上也会自动创建唯一索引。
  • 删除唯一约束只能通过删除唯一索引的方式删除。
  • 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
  • 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和( )中排在第一个的列名相同。也可以自定义唯一性约束名。 ```sql SELECT * FROM information_schema.table_constraints WHERE table_name = ‘test2’;

删除唯一性索引

ALTER TABLE test2 DROP INDEX last_name;

desc test2; ```