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