概述
SQL 的 CHECK
约束是一种用于限制列中数据的合法值的方法。它允许你在数据库表中指定一个条件,只有满足该条件的数据才能被插入或更新到表中。CHECK
约束通常用于确保数据的有效性,防止非法数据输入。
创建带有 CHECK 约束的表
你可以通过在创建表时定义 CHECK
约束来确保数据的合法性。以下是一个简单的例子:
CREATE TABLE Employees ( EmployeeID int PRIMARY KEY, FirstName varchar(255), LastName varchar(255), Age int, Salary decimal(10, 2), CHECK (Age >= 18 AND Age <= 65) );
在这个例子中,我们创建了一个名为 Employees
的表,并为 Age
列添加了一个 CHECK
约束,确保年龄在 18 到 65 岁之间。
在已有表中添加 CHECK 约束
如果你已经有一个表,并且想要为其添加 CHECK
约束,可以使用 ALTER TABLE
语句。例如:
ALTER TABLE Employees ADD CONSTRAINT CHK_EmployeeAge CHECK (Age >= 18 AND Age <= 65);
这里我们给 Employees
表添加了一个名为 CHK_EmployeeAge
的 CHECK
约束。
多个 CHECK 约束
你也可以为同一列设置多个 CHECK
约束,或者为不同的列设置不同的约束。下面的例子展示了如何为 Salary
和 Age
两列分别添加 CHECK
约束:
-- -------------------- ---- ------- ------ ----- --------- - ---------- --- ------- ---- --------- ------------- -------- ------------- --- ---- ------ ----------- --- ----- ---- -- -- --- --- -- ---- ----- ------- - -- --
或者,你也可以为每个约束命名,然后通过名称来引用它们:
ALTER TABLE Employees ADD CONSTRAINT CHK_AgeRange CHECK (Age >= 18 AND Age <= 65), ADD CONSTRAINT CHK_SalaryPositive CHECK (Salary > 0);
CHECK 约束的表达式
CHECK
约束中的表达式可以是任何有效的 SQL 表达式,包括逻辑运算符(如 AND、OR)、比较运算符(如 <、>、=)以及函数调用等。例如,你可以使用函数来检查日期范围:
CREATE TABLE Orders ( OrderID int PRIMARY KEY, CustomerID int, OrderDate date, DeliveryDate date, CHECK (DeliveryDate > OrderDate) );
在这个例子中,我们确保了 DeliveryDate
总是在 OrderDate
之后。
使用子查询的 CHECK 约束
虽然不常见,但理论上你可以在 CHECK
约束中使用子查询。然而,这可能会导致性能问题,并且不是所有数据库系统都支持这种方式。一个可能的例子如下:
CREATE TABLE Products ( ProductID int PRIMARY KEY, ProductName varchar(255), Price decimal(10, 2), CHECK (Price > (SELECT AVG(Price) FROM Products)) );
请注意,上述示例可能无法在所有数据库系统中运行,因为它依赖于表中的当前数据来计算平均价格,而 CHECK
约束通常只在插入或更新操作时执行。
结论
CHECK
约束是数据库设计中非常有用的一种工具,可以帮助你确保数据的一致性和完整性。通过合理地应用 CHECK
约束,可以有效地防止无效数据的输入,从而提高应用程序的健壮性和可靠性。在实际项目中,根据业务需求灵活运用各种约束机制,将使你的数据库更加安全和高效。