摘要:在本教程中,您将学习如何使用 SQL UNIQUE 约束来确保一列或一组列中的所有值都是唯一的。
SQL UNIQUE 约束简介 #
在 SQL 中,UNIQUE 约束确保一列或一组列中的所有值在同一个表中是唯一的。UNIQUE 约束通过防止在指定列中出现重复值来帮助您维护数据完整性。
在实践中,您会发现 UNIQUE 约束对于定义需要唯一值的列(如 username 和 email)非常有用。
创建 UNIQUE 约束 #
要为列创建唯一约束,请使用以下语法:
CREATE TABLE table_name (
column1 datatype UNIQUE,
...
);Code language: SQL (Structured Query Language) (sql)在此语法中,您在创建表时使用 UNIQUE 关键字为 column1 创建唯一约束。这个 UNIQUE 约束是一个列约束,因为我们在表的列定义中定义它。
如果一个 UNIQUE 约束包含多个列,您可以将 UNIQUE 约束定义为表约束:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
UNIQUE (column1, column2)
);Code language: SQL (Structured Query Language) (sql)在此语法中,您在 UNIQUE 关键字前的括号内提供一个以逗号分隔的列列表,该关键字出现在列列表的末尾。
首先,创建一个名为 headhunters 的表,用于存储猎头信息:
CREATE TABLE headhunters (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
);Code language: SQL (Structured Query Language) (sql)在 headhunters 表中,我们为 email 列使用了 UNIQUE 约束,以确保 email 列不会有任何重复值。
其次,向 headhunters 表中插入一个新行:
INSERT INTO
headhunters (first_name, last_name, email)
VALUES
('John', 'Doe', '[email protected]');Code language: SQL (Structured Query Language) (sql)第三,尝试插入一个新行,其电子邮件地址在 email 列中已经存在:
INSERT INTO
headhunters (first_name, last_name, email)
VALUES
('Jane', 'Doe', '[email protected]');Code language: SQL (Structured Query Language) (sql)数据库系统发出错误,指示电子邮件地址重复,并拒绝了插入操作。
ERROR: duplicate key value violates unique constraint "headhunters_email_key"Code language: SQL (Structured Query Language) (sql)UNIQUE 约束名称 #
在定义唯一约束时,您可以选择使用 CONSTRAINT 子句为其分配一个名称:
CONSTRAINT constraint_name
UNIQUE (column1, column2, ...);Code language: SQL (Structured Query Language) (sql)例如,以下语句创建了一个名为 users 的表,用于存储用户信息:
CREATE TABLE users (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
username VARCHAR(25) NOT NULL,
password TEXT NOT NULL,
phone VARCHAR(20),
CONSTRAINT unique_username UNIQUE (username)
);Code language: SQL (Structured Query Language) (sql)在此示例中,我们创建了一个名为 unique_username 的唯一约束,以确保 username 列没有重复值。
如果您没有为 UNIQUE 约束提供名称,数据库系统将为其生成一个默认名称。生成的唯一约束名称可能因数据库系统而异。
下表说明了不同数据库系统中唯一约束的默认名称:
| 数据库系统 | 默认唯一约束名称 | 说明 |
|---|---|---|
| SQL Server | UQ_TableName_ColumnName_Hex | 前缀 UQ_,后跟表名、列名和一个十六进制值以确保唯一性。 |
| Oracle | SYS_Cn | 前缀 SYS_C,后跟一个唯一的数字 (n)。 |
| MySQL | unique_constraint_name | 使用用户提供的名称,如果未指定,则默认为系统生成的名称。 |
| PostgreSQL | table_column_key | 连接表名、列名和字面字符串“key”。 |
| SQLite | sqlite_autoindex_TableName_N | 前缀 sqlite_autoindex_,后跟表名和一个唯一的数字 (N)。 |
| DB2 | SQLnnnnn | 前缀 SQL,后跟一个唯一的数字 nnnnn。 |
向现有表添加 UNIQUE 约束 #
要向现有表添加唯一约束,您可以使用 ALTER TABLE ... ADD CONSTRAINT 语句:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
UNIQUE (colum1, column2, ...);Code language: SQL (Structured Query Language) (sql)如果表中有数据,唯一约束的列(column1, column2, ...)中的值必须是唯一的,否则您会遇到错误。
例如,以下语句使用 ALTER TABLE ... ADD CONSTRAINT 语句向 users 表添加一个唯一约束:
ALTER TABLE users
ADD CONSTRAINT unique_phone UNIQUE (phone);Code language: SQL (Structured Query Language) (sql)如果您想添加一个带有 UNIQUE 约束的新列,请使用 ALTER TABLE ... ADD column 语句:
ALTER TABLE table_name
ADD new_column datatype UNIQUE;Code language: SQL (Structured Query Language) (sql)例如,以下语句将带有 UNIQUE 约束的 employee_id 列添加到 users 表中。
ALTER TABLE users
ADD employee_id INT UNIQUE;Code language: SQL (Structured Query Language) (sql)此唯一约束确保没有两个员工共享同一个用户帐户。
删除 UNIQUE 约束 #
要从表中删除 UNIQUE 约束,请使用 ALTER TABLE .. DROP CONSTRAINT 语句,语法如下:
ALTER TABLE table_name
DROP CONSTRAINT unique_constraint_name;Code language: SQL (Structured Query Language) (sql)在此语法中:
- 首先,指定要从中删除唯一约束的表名。
- 其次,在
DROP CONSTRAINT子句中提供要删除的唯一约束的名称。
例如,以下语句从 users 表中删除 unique_phone 约束:
ALTER TABLE users
DROP CONSTRAINT unique_phone;Code language: SQL (Structured Query Language) (sql)UNIQUE vs. PRIMARY KEY 约束 #
一个表只能有一个主键 (PRIMARY KEY) 约束,但可以有多个 UNIQUE 约束。此外,PRIMARY KEY 约束不允许 NULL 值,而 UNIQUE 约束允许 NULL 值。
下表比较了 PRIMARY KEY 和 UNIQUE 约束:
| 特性 | PRIMARY KEY 约束 | UNIQUE 约束 |
|---|---|---|
| 约束数量 | 每个表一个主键 | 每个表多个唯一约束 |
| 允许 Null 值 | 否 | 是 |
摘要 #
- 使用
UNIQUE约束来确保一列或一组列具有唯一的值。