sql-unique-key
SQL - UNIQUE 约束
Section titled “SQL - UNIQUE 约束”什么是 UNIQUE 约束?
Section titled “什么是 UNIQUE 约束?”UNIQUE 约束确保列或列集中的所有值彼此不同。它防止指定列中出现重复条目,这对于维护数据完整性至关重要。
例如,在 users 表中,您会希望确保每个用户都拥有唯一的电子邮件地址。将 UNIQUE 约束应用于 email 列可以在数据库层面强制执行此规则。
UNIQUE 与 PRIMARY KEY 的区别
Section titled “UNIQUE 与 PRIMARY KEY 的区别”虽然 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 约束
Section titled “定义 UNIQUE 约束”您可以在创建表时定义 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);多列语法(复合唯一键)
Section titled “多列语法(复合唯一键)”复合唯一键确保指定列中值的组合是唯一的。
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'向现有表添加 UNIQUE 约束
Section titled “向现有表添加 UNIQUE 约束”您可以使用 ALTER TABLE 语句向现有表添加 UNIQUE 约束。给约束命名是一个好习惯。
-- 表 'products' 已存在,其中包含列 'sku'ALTER TABLE productsADD CONSTRAINT uq_product_sku UNIQUE (sku);注意:如果列中已包含重复值,此操作将失败。您必须首先清理数据。
删除 UNIQUE 约束
Section titled “删除 UNIQUE 约束”要删除 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 代码。