1. 程式人生 > 實用技巧 >唯一約束 UNIQUE KEY

唯一約束 UNIQUE KEY

目錄

什麼是唯一約束

Unique Key:它是 MySQL 中的唯一約束,是指在所有記錄中欄位的值不能重複出現。例如,為 id 欄位加上唯一性約束後,每條記錄的 id 值都是唯一的,不能出現重複的情況。如果其中一條記錄的 id 值為0001,那麼該表中就不能出現另一條記錄的 id 值也為0001

與主鍵的區別

Unique KeyPrimary 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 是主鍵,namecity 是一個組合 Unique_key,現在插入一條資料:

INSERT INTO `employee` (`name`, `age`, `city`) VALUES ('Tom', '10', '北京');

資料結果:

id name age city
1 Tom 10 北京

唯一性驗證

這時候,如果我們再次插入相同namecity的一條資料:

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 是允許欄位為空的。因為 namecity 都沒有非空限制,所以,我們可以將它們設定為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值時,可以有重複的,而其他的則不能插入重複值。

這裡我們在使用的時候需要特別注意下!