在本教學中,您將學習如何使用MySQL UNIQUE
索引來防止表中一個或多個列中擁有重複的值。
要強制執行一個或多個列的唯一性值,我們經常使用PRIMARY KEY約束。
但是,每個表只有一個主鍵。 如果要使用多個列或一組具有唯一值的列,則不能使用主鍵約束。
幸運的是,MySQL提供了另一種稱為UNIQUE
索引的索引,它允許您在一個或多個列中強制實現值的唯一性。 與PRIMARY KEY
索引不同,每個表可以有多個UNIQUE
索引。
要建立一個UNIQUE
索引,請使用CREATE UNIQUE INDEX語句如下:
CREATE UNIQUE INDEX index_name
ON table_name(index_column_1,index_column_2,...);
在一個或多個列中強制實現值的唯一性的另一種方法是使用唯一約束。建立唯一約束時,MySQL會在幕後建立一個UNIQUE
的索引。
以下語句說明了如何在建立表時建立唯一約束。
CREATE TABLE table_name(
...
UNIQUE KEY(index_column_,index_column_2,...)
);
也可以使用UNIQUE INDEX
而不是UNIQUE KEY
。 它們被稱為相同的東西。
如果要向現有表新增唯一約束,可以使用ALTER TABLE語句,如下所示:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE KEY(column_1,column_2,...);
與其他資料庫系統不同,MySQL將NULL值視為不同的值。 因此,您可以在UNIQUE
索引中具有多個NULL
值。
這就是MySQL的設計方式。 這不是一個錯誤,即使它被報告為一個錯誤。
另一重要的一點是UNIQUE
約束不適用於除了BDB儲存引擎之外的NULL
值。
MySQL UNIQUE索引範例
假設想在應用程式中管理聯絡人。還希望contacts
表中的email
列必須是唯一的。
要執行此規則,請在CREATE TABLE語句中建立唯一的約束,如下所示:
USE testdb;
CREATE TABLE IF NOT EXISTS contacts (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
phone VARCHAR(15) NOT NULL,
email VARCHAR(100) NOT NULL,
UNIQUE KEY unique_email (email)
);
如果使用SHOW INDEXES
語句,將看到MySQL為email
列建立了一個UNIQUE
索引。
SHOW INDEXES FROM contacts;
+----------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| contacts | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
| contacts | 0 | unique_email | 1 | email | A | 0 | NULL | NULL | | BTREE | | |
+----------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set
接下來,向contacts
表中插入一行。
INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('Max','Su','(+86)-999-9988','[email protected]');
現在,如果您嘗試插入電子郵件是[email protected]
的行資料,您將收到一條錯誤訊息。
INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('Max','Su','(+86)-999-9988','[email protected]');
執行上面語句後,應該會看到以下結果 -
1062 - Duplicate entry '[email protected]' for key 'unique_email'
假設您不僅希望電子郵件是唯一的,而且first_name
,last_name
和phone
的組合也是唯一的。 在這種情況下,可以使用CREATE INDEX
語句為這些列建立一個UNIQUE
索引,如下所示:
CREATE UNIQUE INDEX idx_name_phone
ON contacts(first_name,last_name,phone);
將以下行新增到contacts
表中會導致錯誤,因為first_name
,last_name
和phone
的組合已存在。
INSERT INTO contacts(first_name,last_name,phone,email)
VALUES('Max','Su','(+86)-999-9988','[email protected]');
執行上面語句後,應該會看到以下結果 -
1062 - Duplicate entry 'Max-Su-(+86)-999-9988' for key 'idx_name_phone'
可以看到,不可以將重複電話號碼插入到表中。
在本教學中,您已經學習了如何使用MySQL UNIQUE
索引來防止資料庫中的重複值。