Skip to content

sql-unique-key

UNIQUE 约束确保列或列集中的所有值彼此不同。它防止指定列中出现重复条目,这对于维护数据完整性至关重要。

例如,在 users 表中,您会希望确保每个用户都拥有唯一的电子邮件地址。将 UNIQUE 约束应用于 email 列可以在数据库层面强制执行此规则。

虽然 UNIQUE 和 PRIMARY KEY 约束都强制唯一性,但它们之间存在关键差异:

  • 每个表的数量: 一个表只能有一个 PRIMARY KEY,但可以有 多个 UNIQUE 约束。
  • NULL 值: PRIMARY KEY 列不能包含 NULL 值。根据定义,它既是 UNIQUE 又是 NOT NULL。然而,UNIQUE 约束通常允许一个或多个 NULL 值(具体行为可能因数据库系统而异;例如,SQL Server 允许多个 NULL,而 PostgreSQL 和 MySQL 在最新版本中也允许多个 NULL,并将每个 NULL 视为不同的)。
  • 目的: PRIMARY KEY 是表中记录的主要标识符。UNIQUE 约束用于其他必须唯一但不是主标识符的列(例如,email、employee_id、product_sku)。

您可以在创建表时定义 UNIQUE 约束。

CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL
);

复合唯一键确保指定列中值的组合是唯一的。

CREATE TABLE event_registrations (
event_id INT,
user_id INT,
registration_date TIMESTAMP,
PRIMARY KEY (event_id, user_id),
UNIQUE (event_id, user_id) -- 确保用户不能重复注册同一事件
);

如果您尝试将重复值插入到唯一列中,数据库将返回错误。

INSERT INTO users (username, email, password_hash) VALUES ('john.doe', 'john.doe@example.com', 'hash123');
-- 成功
INSERT INTO users (username, email, password_hash) VALUES ('jane.doe', 'john.doe@example.com', 'hash456');
-- 错误:键 'email' 的重复条目 'john.doe@example.com'

您可以使用 ALTER TABLE 语句向现有表添加 UNIQUE 约束。给约束命名是一个好习惯。

-- 表 'products' 已存在,其中包含列 'sku'
ALTER TABLE products
ADD CONSTRAINT uq_product_sku UNIQUE (sku);

注意:如果列中已包含重复值,此操作将失败。您必须首先清理数据。

要删除 UNIQUE 约束,您同样使用 ALTER TABLE,通过其名称引用该约束。

确切的语法因 RDBMS 而异。

-- 对于 MySQL:
ALTER TABLE products DROP INDEX uq_product_sku;
-- 对于 PostgreSQL / SQL Server:
ALTER TABLE products DROP CONSTRAINT uq_product_sku;
  • 始终命名您的约束。 这使得它们将来更易于管理和删除。
  • 将 PRIMARY KEY 用于行的唯一、非空、核心标识符。
  • 将 UNIQUE 用于业务键或其他必须唯一但不是主标识符的字段,例如电子邮件、用户名或 SKU 代码。