SQL唯一約束


在本教學中,將學習如何使用SQL UNIQUE約束強制列或一組列中值的唯一性。

1. 什麼是SQL UNIQUE約束

有時,希望確保一列或多列中的值不重複。 例如,employees表中不能接受的重複電子郵件。由於電子郵件列不是主鍵的一部分,因此防止電子郵件列中重複值的唯一方法是使用UNIQUE約束。

根據定義,SQL UNIQUE約束定義了一個規則,該規則可防止儲存在不參與主鍵的特定列中有重複值。

UNIQUE與PRIMARY KEY約束比較

PRIMARY KEY約束最多只能有一個,而表中可以有多個UNIQUE約束。 如果表中有多個UNIQUE約束,則所有UNIQUE約束必須在不同的列集。

PRIMARY KEY約束不同,UNIQUE約束允許NULL值。 這取決於RDBMS要考慮NULL值是否唯一。

例如,MySQL將NULL值視為不同的值,因此,可以在參與UNIQUE約束的列中儲存多個NULL值。 但是,Microsoft SQL Server或Oracle資料庫不是這種情況。

下表說明了UNIQUE約束和PRIMARY KEY約束之間的區別:

比較項 PRIMARY KEY約束 UNIQUE約束
約束的數量 一個 多個
NULL值 不允許 允許

2. 建立UNIQUE約束

通常,在建立表時建立UNIQUE約束。 以下CREATE TABLE語句定義users表,其中username列是唯一的。

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL
);

要為列建立UNIQUE約束,需要在列定義中新增UNIQUE關鍵字。 在這個範例中,建立了UNIQUE約束作為列約束。

如果插入或更新與username列中已存在的值相同的值,則RDBMS將拒絕更改並返回錯誤。以下語句等效於使用表約束語法建立的UNIQUE約束的上述語句。

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    CONSTRAINT uc_username UNIQUE (username)
);

在這個範例中,將CONSTRAINT子句放在CREATE TABLE語句的末尾。

3. 將UNIQUE約束新增到現有表

如果表已存在,則可以為列新增UNIQUE約束,前提條件是參與UNIQUE約束的列或列組合必須包含唯一值。

假設建立的users表沒有為username列定義UNIQUE約束。 要將UNIQUE約束新增到username列,請使用ALTER TABLE語句,如下所示:

ALTER TABLE users
ADD CONSTRAINT uc_username UNIQUE(username);

如果要新增新列並為建立UNIQUE約束,請使用以下形式的ALTER TABLE語句。

ALTER TABLE users
ADD new_column data_type UNIQUE;

例如,以下語句將帶有UNIQUE約束的email列新增到users表。

ALTER TABLE users
ADD email VARCHAR(255) UNIQUE;

4. 刪除UNIQUE約束

要刪除UNIQUE約束,請使用ALTER TABLE語句,如下所示:

ALTER TABLE table_name
DROP CONSTRAINT unique_constraint_name;

例如,要刪除users表中的uc_username唯一約束,請使用以下語句。

ALTER TABLE users
DROP CONSTRAINT uc_username;

在本教學中,我們學習了UNIQUE約束以及如何應用它來強制一列或多列中值的唯一性。