摘要:本教程将介绍如何使用 SQL 唯一性约束强制列或一组列的唯一性。
什么是 SQL 唯一性约束
有时,需要确保列或一组列的值不重复。例如,员工表中的重复电子邮件是不可接受的。
由于电子邮件列不是主键的一部分,因此防止电子邮件列中出现重复值的唯一方法是使用唯一性约束。
根据定义,SQL 唯一性约束定义了一个规则,该规则可阻止存储在不参与主键的特定列中的重复值。
唯一性与主键约束的对比
一张表中至多可以有一个主键约束,但可以有多个唯一性约束。如果表中有多个唯一性约束,则所有唯一性约束都必须有不同的列集。
与主键约束不同的是,唯一性约束允许NULL值。是否考虑 NULL 值唯一取决于 RDBMS。
例如,MySQL 将 NULL 值视为不同的值,因此,可以在参与唯一性约束的列中存储多个 NULL 值。然而,对于 Microsoft SQL Server 或 Oracle Database 来说并非如此。
下表说明了唯一性约束和主键约束之间的差异
不允许
主键约束 | 唯一性约束 | |
约束数 | 一个 | 多个 |
NULL值 | 不允许 | 允许 |
创建唯一性约束
通常,在创建表时创建唯一性约束。以下CREATE TABLE 语句定义了用户名列唯一的用户表。
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
为列创建唯一性约束,需要在列定义中添加 UNIQUE 关键字。在本例中,我们创建唯一性约束作为列约束。
如果插入或更新的值与用户名列中已存在的值相同,RDBMS 将拒绝更改并返回错误。
以下语句等效于使用表约束语法创建唯一性约束的上述语句。
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)
);
Code language: SQL (Structured Query Language) (sql)
在本例中,将 CONSTRAINT 子句放在 CREATE TABLE 语句的末尾。
向现有表添加唯一性约束
如果表已存在,则可以为列添加唯一性约束,前提是参与唯一性约束的列或列的组合必须包含唯一值。
假设在为用户名列定义唯一性约束的情况下创建了用户表。若要将唯一性约束添加到用户名列,可以使用ALTER TABLE语句,如下所示
ALTER TABLE users
ADD CONSTRAINT uc_username UNIQUE(username);
Code language: SQL (Structured Query Language) (sql)
如果要添加一个新列并为其创建一个唯一性约束,则使用 ALTER TABLE 语句的以下形式。
ALTER TABLE users
ADD new_column data_type UNIQUE;
Code language: SQL (Structured Query Language) (sql)
例如,以下语句向用户表添加具有 UNIQUE 约束的 email 列。
ALTER TABLE users
ADD email VARCHAR(255) UNIQUE;
Code language: SQL (Structured Query Language) (sql)
移除 UNIQUE 约束
若要移除 UNIQUE 约束,您可以使用 ALTER TABLE 语句,如下所示
ALTER TABLE table_name
DROP CONSTRAINT unique_constraint_name;
Code language: SQL (Structured Query Language) (sql)
例如,要移除 users 表中的 uc_username 唯一约束,可以使用以下语句。
ALTER TABLE users
DROP CONSTRAINT uc_username;
Code language: SQL (Structured Query Language) (sql)
在本教程中,您已了解 UNIQUE 约束以及如何应用它来强制一列或一组列中的值的唯一性。