MySQL UNIQUE索引

2019-10-16 22:58:24

在本教學中,您將學習如何使用MySQL UNIQUE索引來防止表中一個或多個列中擁有重複的值。

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 UNIQUE索引和NULL

與其他資料庫系統不同,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_namelast_namephone的組合也是唯一的。 在這種情況下,可以使用CREATE INDEX語句為這些列建立一個UNIQUE索引,如下所示:

CREATE UNIQUE INDEX idx_name_phone
ON contacts(first_name,last_name,phone);

將以下行新增到contacts表中會導致錯誤,因為first_namelast_namephone的組合已存在。

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索引來防止資料庫中的重複值。