SQL Unique
SQL UNIQUE 约束
Section titled “SQL UNIQUE 约束”SQL UNIQUE 约束
Section titled “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 约束
Section titled “删除 UNIQUE 约束”要删除 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的组合是唯一的,这意味着一个学生只能选同一门课一次。