唯一性约束(UNIQUE)
唯一性约束的作用:
用来限制某个字段的值不能重复(但是可以有多个null)
唯一性约束的特点:
- 同一个表可以有多个唯一性约束
- 唯一性约束可以是某一个列的值唯一,也可以是多个列组合的值唯一
- 也就是说: 我们的唯一性约束可以声明为表级约束(可以声明为表级约束也就可以声明为复合约束)
- 唯一性约束允许列值为空
- 允许加了唯一性约束的字段的值有多个为null
- 在创建唯一性约束的时候,如果没有给唯一性约束命名,则唯一性约名默认和列名相同
- MySQL会在加了唯一性约束的列上默认创建一个唯一性索引,并且创建的唯一索引名和对应的唯一性约束名相同
如何添加唯一性约束?
这里我们通过两种方式添加唯一性约束
方式一: 在CREATE TABLE时添加唯一性索引
下面我们通过举例说明如何在CREATE TABLE时添加唯一性约束
CREATE TABLE test2(
# 这里就是声明了一个列级约束,也就是我们的唯一性约束
id INT UNIQUE,
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10,2)
);
- 注意: 在我们创建表的时候如果是声明为列级约束的时候, 那么这个时候我们不能使用CONSTRAINT关键字为约束起名
- 这里就是给test2表中的id字段添加了给唯一性约束(这里声明为了列级约束)
CREATE TABLE test3(
id INT UNIQUE,
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10,2),
#这里就是声明了一个表级约束
[CONSTRAINT uk_test2_email] UNIQUE(email)
);
- 上面[]中的内容可以省略,[]中的内容其实就是给唯一性约束起一个名字
- 这里的CONSTRAINT uk_test2_email其实就是给这个唯一性约束起了一个名字叫做: uk_test2_email
- 如果我们在添加唯一性约束的时候没有给唯一性约束命名,则默认和字段名(列名)同名
在我们创建完表并且添加了唯一性约束之后,这个时候我们可以发现在表中的数据中,对于这些添加了唯一性约束的字段的值不可以重复,但是可以有多个值同时为NULL,也就说明了多个null之间并不相同
INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'tom','tom1@126.com',4800);
- 这里是创建了表之后的第一次添加数据,这次执行没有问题
INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'tom','tom2@126.com'4600);
- 这个时候就会添加失败,因为我们给test2表中的id字段添加了唯一性约束,这个时候我们test2表中的数据中id字段的值就不可以重复,这个时候我们添加这条记录的时候判断出我们的表中已经有id为1的记录了,这个时候我们要添加的这个记录的id就不能为1,所以这个时候就会执行出现错误
INSERT INTO test2(id,last_name,email,salary)
VALUES(2,'tom1',NULL,4600),
(s,'tom2',NULL,4600);
- 这个时候添加是成功的,也就是说明我们添加了唯一性约束(UNIQUE)的字段上时可以添加null值的,而且可以多次添加null值,我们这里就是给表中声明为unique的字段email一次性添加了两个为null值的记录,这个时候执行没有出错
对于唯一性约束来讲,我们不仅仅可以声明为列级约束,还可以声明为表级约束,可以声明为表级约束,那么也就是说明可以声明为复合约束(复合约束: 也就是约束多个字段)
那么如何声明为复合的唯一性约束?
CREATE TABLE USER(
id INT
'name' VARCHAR(15),
'password' VARCHAR(25),
#表级约束(这个时候我们将这个表级约束声明为复合约束)
CONSTRAINT uk_user_name_pwd UNIQUE('name','password'),
);
- 这里我们就是声明了一个表级约束,并且我们声明为了一个符合约束,至于为什么叫复合约束?
- 应该这个时候我们同一个约束一次约束了两个字段(name和password)
注意: 当声明为符合的唯一性约束的时候,只有复合的唯一性约束的这几个字段值都相同的时候才说明是重复的
eg:
INSERT INTO USER
VALUES(1,'tom','abc'),
(1,'tom1','abc');
- 我们知道前面我们将复合的唯一约束添加到了name和password字段上,这个时候就是当name字段和password字段的值都相同时这个时候才表示不重复,这里只有password的值重复了,而对于name的值并没有重复,这个时候就会添加成功
方式二: 在ALTER TABLE时添加唯一性约束
而在情况二中我们又有两种添加唯一性约束的方式:
方式一: ADD
ALTER TABLE test2
ADD [CONSTRAINT uk_test2_sal] UNIQUE(salary);
- 在这种add的方式中添加唯一性约束的时候和前面在CREATE TABLE时添加的时候添加表级约束的格式相似
方式二: MODIFY
ALTER TABLE test2
MODIFY last_name VARCHAR(15) UNIQUE;
- 这种MODIFY的方式添加唯一性约束的时候和前面我们在CREATE TABLE时添加的时候添加列级约束的格式相似
那么如何删除唯一性约束?
在删除唯一性约束之前我们要知道:
- 添加唯一性约束的字段也会自动创建唯一性索引
- 删除唯一性约束只能通过删除唯一索引的的方式删除
- 删除唯一性索引时要指定唯一索引名,唯一性索引名和唯一约束名一样
- 如果创建唯一约束时没有指定约束名,那么如果是单列约束,就默认和列名相同,如果还是复合约束,那么默认就是和组合列中的第一个列的列名相同
然后这里我们来举例说明如何删除唯一性索引(DROP INDEX)
注意: 唯一性索引删除之后对应的唯一性约束就会自动删除掉
ALTER TABLE test2
DROP INDEX last_name;
- 我们在test2表中给last_name字段添加唯一性约束的时候是通过在CREATE TABLE的时候以列级约束的方式添加的,我们添加唯一性索引的时候并不能指定约束名,那么唯一约束名默认就和我们的last_name列名相同,那么唯一性索引名又和唯一性约束名相同,那么就是都为last_name
ALTER TABLE test2
DROP TABLE uk_test2_sal;
- 这里我们在个test2表中的salary字段添加唯一性约束的时候是通过在CREATE TABLE的时候以表级约束的方式添加的,我们添加这个唯一性约束的时候给这个唯一性约束指定了名称: uk_test2_sal,那么这个时候我们的唯一性索引名也就为: uk_test2_sal