Skip to content

SQL Unique

UNIQUE 约束确保一个列或一组列中的所有值在表中是互不相同的。这意味着没有两行在指定的 unique 列(或列组合)中具有相同的值(或值组合)。

UNIQUE 和 PRIMARY KEY 约束都保证一个列或一组列的唯一性。然而,它们之间存在关键区别:

  • 一个表只能有一个 PRIMARY KEY 约束,但可以有多个 UNIQUE 约束。

  • PRIMARY KEY 列自动强制 NOT NULL。UNIQUE 约束列默认可以允许一个 NULL 值(尽管某些数据库可能允许多个 NULL,行为可能有所不同;通常 NULL 不被视为等于另一个 NULL)。如果不需要 NULL 值,通常也会对 UNIQUE 列应用 NOT NULL。

在 CREATE TABLE 中使用 SQL UNIQUE 约束

Section titled “在 CREATE TABLE 中使用 SQL UNIQUE 约束”

以下 SQL 在创建 Users 表时,在 Email 列上创建一个 UNIQUE 约束。

通用语法(大多数数据库,如 SQL Server, Oracle, PostgreSQL, MySQL):

CREATE TABLE Users ( UserID INT PRIMARY KEY, Username VARCHAR(50) NOT NULL UNIQUE, — Inline UNIQUE constraint Email VARCHAR(100) NOT NULL, DateRegistered DATE, CONSTRAINT UQ_User_Email UNIQUE (Email) — Named UNIQUE constraint );

MySQL 特有语法(内联替代方案):

CREATE TABLE Users ( UserID INT NOT NULL, Username VARCHAR(50) NOT NULL, Email VARCHAR(100) NOT NULL, DateRegistered DATE, PRIMARY KEY (UserID), UNIQUE (Username), UNIQUE KEY UQ_User_Email (Email) — MySQL specific ‘UNIQUE KEY’ );

要定义一个包含多个列的 UNIQUE 约束(复合 unique 键),必须使用命名约束的语法:

MySQL / SQL Server / Oracle / PostgreSQL:

CREATE TABLE ProductSuppliers ( ProductID INT, SupplierID INT, SupplyPrice DECIMAL(10, 2), PRIMARY KEY (ProductID, SupplierID), — Assuming this is the PK CONSTRAINT UQ_ProductSupplier_Price UNIQUE (ProductID, SupplierID, SupplyPrice) — Example for multi-column unique );

一个更实际的多列 unique 约束可能是 UNIQUE (columnA, columnB),如果任意两行不应在 columnA 和 columnB 上具有相同的组合值。

在 ALTER TABLE 中使用 SQL UNIQUE 约束

Section titled “在 ALTER TABLE 中使用 SQL UNIQUE 约束”

要在表已存在时在列上创建 UNIQUE 约束,请使用 ALTER TABLE 语句。

MySQL / SQL Server / Oracle / PostgreSQL:

ALTER TABLE Users ADD UNIQUE (Username);

要命名一个 UNIQUE 约束,或在多个列上定义它:

MySQL / SQL Server / Oracle / PostgreSQL:

ALTER TABLE Users ADD CONSTRAINT UQ_Username UNIQUE (Username);

— For multiple columns: — ALTER TABLE UserProfiles — ADD CONSTRAINT UQ_UserProfile_Detail UNIQUE (UserID, ProfileType);

要删除 UNIQUE 约束,你需要知道它的名称。如果你没有命名它,系统会分配一个默认名称,你需要找到它(通常通过数据库元数据表)。

MySQL:

ALTER TABLE Users DROP INDEX UQ_Username; — Or the system-generated name

SQL Server / Oracle / PostgreSQL:

ALTER TABLE Users DROP CONSTRAINT UQ_Username; — Or the system-generated name

  • 确保用户注册系统中的电子邮件地址或用户名是唯一的。

  • 防止库存表中出现重复的产品代码或序列号。

  • 强制在选课表中 StudentID 和 CourseID 的组合是唯一的,这意味着一个学生只能选同一门课一次。