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約束以及如何應用它來強制一列或多列中值的唯一性。