【mysql】唯一性束缚unique

打印 上一主题 下一主题

主题 889|帖子 889|积分 2667

唯一性束缚

1. 作用

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

2. 关键字

  1. UNIQUE
复制代码
3. 特点



  • 同一个表可以有多个唯一束缚。
  • 唯一束缚可以是某一个列的值唯一,也可以多个列组合的值唯一。
  • 唯一性束缚答应列值为空。
  • 在创建唯一束缚的时候,假如不给唯一束缚命名,就默认和列名雷同。
  • MySQL会给唯一束缚的列上默认创建一个唯一索引。
4. 添加唯一束缚

(1)建表时


  • 在CREATE TABLE时添加束缚
  1. CREATE TABLE test2(id INT UNIQUE
  2. , #列级束缚last_name VARCHAR(15) ,email VARCHAR(25),salary DECIMAL(10,2),#表级束缚CONSTRAINT uk_test2_email UNIQUE
  3. (email));
复制代码



  • 检察束缚
  1. SELECT * FROM information_schema.table_constraints
  2. WHERE table_name = 'test2';
复制代码


  • 可以看到,没有写 束缚名 的时候以定义的列名 id 来命名

  • 在创建唯一束缚的时候,假如不给唯一束缚命名,就默认和列名雷同。
  1. INSERT INTO test2(id,last_name,email,salary)
  2. VALUES(1,'Tom','tom@126.com',4500);
  3. #错误:Duplicate entry '1' for key 'test2.id'
  4. INSERT INTO test2(id,last_name,email,salary)
  5. VALUES(1,'Tom1','tom1@126.com',4600);
  6. #错误:Duplicate entry 'tom@126.com' for key 'test2.uk_test2_email'
  7. INSERT INTO test2(id,last_name,email,salary)
  8. VALUES(2,'Tom1','tom@126.com',4600);
复制代码


  • 可以向声明为unique的字段上添加null值。而且可以多次添加null
  1. INSERT INTO test2(id,last_name,email,salary)
  2. VALUES(2,'Tom1',NULL,4600);
复制代码

  1. INSERT INTO test2(id,last_name,email,salary)
  2. VALUES(3,'Tom3',NULL,4600);
复制代码

  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(        cid INT UNIQUE
  2. ,        cname VARCHAR(100) UNIQUE
  3. ,        description VARCHAR(200));
复制代码
  1. CREATE TABLE USER( id INT NOT NULL, NAME VARCHAR(25), PASSWORD VARCHAR(16), -- 使用表级束缚语法 CONSTRAINT uk_name_pwd UNIQUE
  2. (NAME,PASSWORD));
复制代码
  表示用户名和暗码组合不能重复
  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;
复制代码


  • 在ALTER TABLE时添加束缚
  1. UPDATE test2
  2. SET salary = 5000
  3. WHERE id = 3;
复制代码
  1. #方式1:ALTER TABLE test2ADD CONSTRAINT uk_test2_sal UNIQUE
  2. (salary);
复制代码

  1. #方式2:ALTER TABLE test2MODIFY last_name VARCHAR(15) UNIQUE
  2. ;
复制代码

  1. #字段列表中如果是一个字段,表示该列的值唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的
  2. #方式1:
  3. alter table 表名称 add unique key(字段列表);
复制代码
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;+------+-------+| cid  | cname |+------+-------+| 1001 | Java  || 1002 | MySQL |+------+-------+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的复合唯一
复制代码


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表