唯一性束缚
1. 作用
用来限制某个字段/某列的值不能重复。
2. 关键字
3. 特点
- 同一个表可以有多个唯一束缚。
- 唯一束缚可以是某一个列的值唯一,也可以多个列组合的值唯一。
- 唯一性束缚答应列值为空。
- 在创建唯一束缚的时候,假如不给唯一束缚命名,就默认和列名雷同。
- MySQL会给唯一束缚的列上默认创建一个唯一索引。
4. 添加唯一束缚
(1)建表时
- CREATE TABLE test2(id INT UNIQUE
- , #列级束缚last_name VARCHAR(15) ,email VARCHAR(25),salary DECIMAL(10,2),#表级束缚CONSTRAINT uk_test2_email UNIQUE
- (email));
复制代码
- SELECT * FROM information_schema.table_constraints
- WHERE table_name = 'test2';
复制代码
- 可以看到,没有写 束缚名 的时候以定义的列名 id 来命名
- 在创建唯一束缚的时候,假如不给唯一束缚命名,就默认和列名雷同。
- INSERT INTO test2(id,last_name,email,salary)
- VALUES(1,'Tom','tom@126.com',4500);
- #错误:Duplicate entry '1' for key 'test2.id'
- INSERT INTO test2(id,last_name,email,salary)
- VALUES(1,'Tom1','tom1@126.com',4600);
- #错误:Duplicate entry 'tom@126.com' for key 'test2.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,'Tom3',NULL,4600);
复制代码
- create table 表名称(
- 字段名 数据类型,
- 字段名 数据类型 unique,
- 字段名 数据类型 unique key,
- 字段名 数据类型
- );
- create table 表名称(
- 字段名 数据类型,
- 字段名 数据类型,
- 字段名 数据类型,
- [constraint 约束名] unique key(字段名)
- );
复制代码 举例:
- create table student(
- sid int,
- sname varchar(20),
- tel char(11) unique,
- cardid char(18) unique key
- );
复制代码- CREATE TABLE t_course( cid INT UNIQUE
- , cname VARCHAR(100) UNIQUE
- , description VARCHAR(200));
复制代码- CREATE TABLE USER( id INT NOT NULL, NAME VARCHAR(25), PASSWORD VARCHAR(16), -- 使用表级束缚语法 CONSTRAINT uk_name_pwd UNIQUE
- (NAME,PASSWORD));
复制代码 表示用户名和暗码组合不能重复
- insert into student values(1,'张三','13710011002','101223199012015623');
- insert into student values(2,'李四','13710011003','101223199012015624');
复制代码- mysql> select * from student;
- +-----+-------+-------------+--------------------+
- | sid | sname | tel | cardid |
- +-----+-------+-------------+--------------------+
- | 1 | 张三 | 13710011002 | 101223199012015623 |
- | 2 | 李四 | 13710011003 | 101223199012015624 |
- +-----+-------+-------------+--------------------+
- 2 rows in set (0.00 sec)
复制代码- insert into student values(3,'王五','13710011004','101223199012015624'); #身份证号重复
- ERROR 1062 (23000): Duplicate entry '101223199012015624' for key 'cardid'
- insert into student values(3,'王五','13710011003','101223199012015625');
- ERROR 1062 (23000): Duplicate entry '13710011003' for key 'tel'
复制代码 (2)建表后指定唯一键束缚
- #字段列表中如果是一个字段,表示该列的值唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的
- #方式1:
- alter table 表名称 add unique key(字段列表);
复制代码- #方式2:
- alter table 表名称 modify 字段名 字段类型 unique;
复制代码
- UPDATE test2
- SET salary = 5000
- WHERE id = 3;
复制代码- #方式1:ALTER TABLE test2ADD CONSTRAINT uk_test2_sal UNIQUE
- (salary);
复制代码
- #方式2:ALTER TABLE test2MODIFY last_name VARCHAR(15) UNIQUE
- ;
复制代码
- #字段列表中如果是一个字段,表示该列的值唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的
- #方式1:
- alter table 表名称 add unique key(字段列表);
复制代码 5. 关于复合唯一束缚
- create table 表名称(
- 字段名 数据类型,
- 字段名 数据类型,
- 字段名 数据类型,
- unique key(字段列表) #字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多个字段的组合是唯一的
- );
复制代码- #学生表
- create table student(
- sid int, #学号
- sname varchar(20), #姓名
- tel char(11) unique key, #电话
- cardid char(18) unique key #身份证号
- );
- #课程表
- create table course(
- cid int, #课程编号
- cname varchar(20) #课程名称
- );
- #选课表
- create table student_course(
- id int,
- sid int,
- cid int,
- score int,
- unique key(sid,cid) #复合唯一
- );
复制代码- insert into student values(1,'张三','13710011002','101223199012015623');#成功
- insert into student values(2,'李四','13710011003','101223199012015624');#成功
- insert into course values(1001,'Java'),(1002,'MySQL');#成功
复制代码- mysql> select * from student;
- +-----+-------+-------------+--------------------+
- | sid | sname | tel | cardid |
- +-----+-------+-------------+--------------------+
- | 1 | 张三 | 13710011002 | 101223199012015623 |
- | 2 | 李四 | 13710011003 | 101223199012015624 |
- +-----+-------+-------------+--------------------+
- 2 rows in set (0.00 sec)
- mysql> select * from course;+------+-------+| cid | cname |+------+-------+| 1001 | Java || 1002 | MySQL |+------+-------+2 rows in set (0.00 sec)
复制代码- insert into student_course values
- (1, 1, 1001, 89),
- (2, 1, 1002, 90),
- (3, 2, 1001, 88),
- (4, 2, 1002, 56);#成功
复制代码- mysql> select * from student_course;
- +----+------+------+-------+
- | id | sid | cid | score |
- +----+------+------+-------+
- | 1 | 1 | 1001 | 89 |
- | 2 | 1 | 1002 | 90 |
- | 3 | 2 | 1001 | 88 |
- | 4 | 2 | 1002 | 56 |
- +----+------+------+-------+
- 4 rows in set (0.00 sec)
复制代码- insert into student_course values (5, 1, 1001, 88);#失败
- #ERROR 1062 (23000): Duplicate entry '1-1001' for key 'sid' 违反sid-cid的复合唯一
复制代码
- 删除唯一束缚
- 添加唯一性束缚的列上也会自动创建唯一索引。
- 删除唯一束缚只能通过删除唯一索引的方式删除。
- 删除时需要指定唯一索引名,唯一索引名就和唯一束缚名一样。
- 假如创建唯一束缚时未指定名称,假如是单列,就默认和列名雷同;假如是组合列,那么默认和()中排在第一个的列名雷同。也可以自定义唯一性束缚名。
- SELECT * FROM information_schema.table_constraints
- WHERE table_name = '表名'; #查看都有哪些约束
复制代码- ALTER TABLE USER
- DROP INDEX uk_name_pwd;
复制代码 注意:可以通过 show index from 表名称; 检察表的索引
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |