在本教學中,將學習如何使用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值 | 不允許 | 允許 |
通常,在建立表時建立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
語句的末尾。
如果表已存在,則可以為列新增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;
要刪除UNIQUE
約束,請使用ALTER TABLE
語句,如下所示:
ALTER TABLE table_name
DROP CONSTRAINT unique_constraint_name;
例如,要刪除users
表中的uc_username
唯一約束,請使用以下語句。
ALTER TABLE users
DROP CONSTRAINT uc_username;
在本教學中,我們學習了UNIQUE約束以及如何應用它來強制一列或多列中值的唯一性。