SQL Check
SQL CHECK 约束
Section titled “SQL CHECK 约束”SQL CHECK 约束
Section titled “SQL CHECK 约束”CHECK 约束是 SQL 中一个强大的工具,用于通过限制可以在列或一组列中放置的值的范围来强制执行域完整性(domain integrity)。它确保输入到表中的数据符合特定的业务规则或条件。
如果您在单个列上定义 CHECK 约束,则它只允许该列中那些在指定条件下评估为 TRUE 的值。
如果您在表级别定义 CHECK 约束,则它可以根据同一行中其他列的值来限制特定列的值。
在 CREATE TABLE 中使用 SQL CHECK 约束
Section titled “在 CREATE TABLE 中使用 SQL CHECK 约束”您可以在创建表时定义 CHECK 约束。以下 SQL 在创建 Persons 表时,在 Age 列上创建了一个 CHECK 约束。该约束指定 Age 列必须只包含大于或等于 18 的整数。
通用语法(列定义内联):
CREATE TABLE Persons ( PersonID INT PRIMARY KEY, LastName VARCHAR(255) NOT NULL, FirstName VARCHAR(255), Age INT CHECK (Age >= 18), — Inline CHECK constraint City VARCHAR(255) );
要显式命名 CHECK 约束,或者定义涉及多个列的约束(表级别约束),请使用以下语法。命名约束是一个好习惯,因为这使得它们更容易管理(例如,以后删除或修改)。
通用语法(命名约束):
CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(100), LastName VARCHAR(100), Salary DECIMAL(10, 2), Bonus DECIMAL(10, 2), HireDate DATE, TerminationDate DATE, CONSTRAINT CK_Employee_Salary CHECK (Salary > 0), — Named CHECK constraint for a single column CONSTRAINT CK_Employee_Dates CHECK (TerminationDate IS NULL OR TerminationDate > HireDate) — Named CHECK involving multiple columns );
注意:定义命名约束(特别是表级 CHECK 约束)的确切语法在 PostgreSQL、SQL Server、Oracle 中大体上是标准的。MySQL 从 8.0.16 版本开始才正确支持 CHECK 约束;在此之前,语法被接受但不强制执行。
在 ALTER TABLE 中使用 SQL CHECK 约束
Section titled “在 ALTER TABLE 中使用 SQL CHECK 约束”要向现有表添加 CHECK 约束,请使用 ALTER TABLE 语句。
向现有列添加 CHECK 约束(例如,Persons 表中的 Age):
ALTER TABLE Persons ADD CONSTRAINT CK_Person_Age CHECK (Age >= 18);
此语法通常是标准的。如果表中已包含违反新约束的数据,则 ALTER TABLE 语句在某些数据库系统中可能会失败,或者约束可能仅应用于新的或更新的行,具体取决于所使用的 RDBMS(关系型数据库管理系统)。
删除 CHECK 约束
Section titled “删除 CHECK 约束”要移除现有的 CHECK 约束,您也使用 ALTER TABLE 语句。通常您需要知道约束的名称。
标准 SQL (PostgreSQL, SQL Server, Oracle):
ALTER TABLE Persons DROP CONSTRAINT CK_Person_Age;
MySQL (从 8.0.16 版本开始):
ALTER TABLE Persons DROP CHECK CK_Person_Age; — Or the system-generated name if not explicitly named
实际应用:CHECK 约束对于维护数据质量和在数据库级别强制执行业务逻辑至关重要。示例包括:
- 确保产品价格始终为正。
- 验证电子邮件地址列包含 ’@’ 符号。
- 验证结束日期在开始日期之后。
- 将状态列限制为预定义的值集(例如,
Status IN ('Pending', 'Active', 'Inactive'))。
学习难点:如果约束未显式命名,查找系统生成的名称可能会很棘手。数据库系统提供了查询元数据(metadata)(系统目录或 INFORMATION_SCHEMA)以查找约束名称的方法。