什么是唯一約束
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
值時,可以有重復的,而其他的則不能插入重復值。
這里,我們在使用的時候需要特別注意下!
