3.1 作用

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

3.2 关键字

UNIQUE

3.3 特点

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

3.4 添加唯一约束

(1)建表时

  1. create table 表名称(
  2. 字段名 数据类型,
  3. 字段名 数据类型 unique,
  4. 字段名 数据类型 unique key,
  5. 字段名 数据类型
  6. );
  7. create table 表名称(
  8. 字段名 数据类型,
  9. 字段名 数据类型,
  10. 字段名 数据类型,
  11. [constraint 约束名] unique key(字段名)
  12. );

举例:

  1. create table student(
  2. sid int,
  3. sname varchar(20),
  4. tel char(11) unique,
  5. cardid char(18) unique key
  6. );
  1. CREATE TABLE t_course(
  2. cid INT UNIQUE,
  3. cname VARCHAR(100) UNIQUE,
  4. description VARCHAR(200)
  5. );
  1. CREATE TABLE USER(
  2. id INT NOT NULL,
  3. NAME VARCHAR(25),
  4. PASSWORD VARCHAR(16),
  5. -- 使用表级约束语法
  6. CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
  7. );

表示用户名和密码组合不能重复

  1. insert into student values(1,'张三','13710011002','101223199012015623');
  2. insert into student values(2,'李四','13710011003','101223199012015624');
  1. mysql> select * from student;
  2. +-----+-------+-------------+--------------------+
  3. | sid | sname | tel | cardid |
  4. +-----+-------+-------------+--------------------+
  5. | 1 | 张三 | 13710011002 | 101223199012015623 |
  6. | 2 | 李四 | 13710011003 | 101223199012015624 |
  7. +-----+-------+-------------+--------------------+
  8. 2 rows in set (0.00 sec)
  1. insert into student values(3,'王五','13710011004','101223199012015624'); #身份证号重复
  2. ERROR 1062 (23000): Duplicate entry '101223199012015624' for key 'cardid'
  3. insert into student values(3,'王五','13710011003','101223199012015625');
  4. ERROR 1062 (23000): Duplicate entry '13710011003' for key 'tel'

(2)建表后指定唯一键约束

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

举例:

  1. ALTER TABLE USER
  2. ADD UNIQUE(NAME,PASSWORD);
  1. ALTER TABLE USER
  2. ADD CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD);
  1. ALTER TABLE USER
  2. MODIFY NAME VARCHAR(20) UNIQUE;

举例:

  1. create table student(
  2. sid int primary key,
  3. sname varchar(20),
  4. tel char(11) ,
  5. cardid char(18)
  6. );
  1. alter table student add unique key(tel);
  2. alter table student add unique key(cardid);

3.5 关于复合唯一约束

  1. create table 表名称(
  2. 字段名 数据类型,
  3. 字段名 数据类型,
  4. 字段名 数据类型,
  5. unique key(字段列表) #字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多个字段的组合是唯一的
  6. );
  1. #学生表
  2. create table student(
  3. sid int, #学号
  4. sname varchar(20), #姓名
  5. tel char(11) unique key, #电话
  6. cardid char(18) unique key #身份证号
  7. );
  8. #课程表
  9. create table course(
  10. cid int, #课程编号
  11. cname varchar(20) #课程名称
  12. );
  13. #选课表
  14. create table student_course(
  15. id int,
  16. sid int,
  17. cid int,
  18. score int,
  19. unique key(sid,cid) #复合唯一
  20. );
  1. insert into student values(1,'张三','13710011002','101223199012015623');#成功
  2. insert into student values(2,'李四','13710011003','101223199012015624');#成功
  3. insert into course values(1001,'Java'),(1002,'MySQL');#成功
  1. mysql> select * from student;
  2. +-----+-------+-------------+--------------------+
  3. | sid | sname | tel | cardid |
  4. +-----+-------+-------------+--------------------+
  5. | 1 | 张三 | 13710011002 | 101223199012015623 |
  6. | 2 | 李四 | 13710011003 | 101223199012015624 |
  7. +-----+-------+-------------+--------------------+
  8. 2 rows in set (0.00 sec)
  9. mysql> select * from course;
  10. +------+-------+
  11. | cid | cname |
  12. +------+-------+
  13. | 1001 | Java |
  14. | 1002 | MySQL |
  15. +------+-------+
  16. 2 rows in set (0.00 sec)
  1. insert into student_course values
  2. (1, 1, 1001, 89),
  3. (2, 1, 1002, 90),
  4. (3, 2, 1001, 88),
  5. (4, 2, 1002, 56);#成功
  1. mysql> select * from student_course;
  2. +----+------+------+-------+
  3. | id | sid | cid | score |
  4. +----+------+------+-------+
  5. | 1 | 1 | 1001 | 89 |
  6. | 2 | 1 | 1002 | 90 |
  7. | 3 | 2 | 1001 | 88 |
  8. | 4 | 2 | 1002 | 56 |
  9. +----+------+------+-------+
  10. 4 rows in set (0.00 sec)
  1. insert into student_course values (5, 1, 1001, 88);#失败
  2. #ERROR 1062 (23000): Duplicate entry '1-1001' for key 'sid' 违反sid-cid的复合唯一

3.5 删除唯一约束

  • 添加唯一性约束的列上也会自动创建唯一索引。
  • 删除唯一约束只能通过删除唯一索引的方式删除。
  • 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
  • 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。
  1. SELECT * FROM information_schema.table_constraints WHERE table_name = '表名'; #查看都有哪些约束
  1. ALTER TABLE USER
  2. DROP INDEX uk_name_pwd;

注意:可以通过 show index from 表名称;查看表的索引