什么是唯一约束
Unique Key:它是 MySQL
中的唯一约束,是指在所有记录中字段的值不能重复出现。例如,为 id
字段加上唯一性约束后,每条记录的 id
值都是唯一的,不能出现重复的情况。如果其中一条记录的 id
值为0001
,那么该表中就不能出现另一条记录的 id
值也为0001
。
与主键的区别
Unique Key
与 Primary Key
都是 MySQL
中的唯一约束类型,但不同的是,Unique Key
可以有多个字段,而且可以为空,但只能有一个为空,而主键约束则只允许有一个字段,且不能为空。
创建唯一约束
我们可以创建多字段唯一约束,例如:
CREATE TABLE `employee` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int DEFAULT NULL,
`city` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQUE_KEY` (`name`,`city`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
id
是主键,name
和 city
是一个组合 Unique_key
,现在插入一条数据:
INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', '北京');
数据结果:
id | name | age | city |
---|---|---|---|
1 | Tom | 10 | 北京 |
唯一性验证
这时候,如果我们再次插入相同name
和city
的一条数据:
INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', '北京');
这时候出现了如下报错信息,存在重复键Tom-北京
:
[SQL]INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', '北京');
[Err] 1062 - Duplicate entry 'Tom-北京' for key 'employee.UNIQUE_KEY'
所以,唯一约束起了作用。
注意:Unique_key
是允许字段为空的。因为 name
与 city
都没有非空限制,所以,我们可以将它们设置为null
。
这里我们需要解释下,Unique_key
中唯一性
是说你不能插入相同的值,但如果你插入的字段其中有null
,那么,即使你重复插入,唯一约束也不会起作用!
例如,我们连续执行以下SQL:
INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', NULL);
INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', NULL);
INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', NULL);
这时候是不会报错的,而且全都插入成功。
id | name | age | city |
---|---|---|---|
1 | Tom | 10 | NULL |
2 | Tom | 10 | NULL |
3 | Tom | 10 | NULL |
原因:
主键和唯一键约束是通过参考索引实施的,如果插入的值均为NULL
,则根据索引的原理,全NULL
值不被记录在索引上,所以插入全NULL
值时,可以有重复的,而其他的则不能插入重复值。
这里,我们在使用的时候需要特别注意下!
![DAY DAY UP A](https://imgkr.cn-bj.ufileos.com/5a820626-482d-4c2c-94aa-6f77c4ff9e21.gif)