在本教程中,将学习如何使用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约束以及如何应用它来强制一列或多列中值的唯一性。