SQL CHECK 约束详细示例
1. 基本数值范围检查
1 2 3 4 5 6
| CREATE TABLE Products ( ProductID INT PRIMARY KEY, ProductName VARCHAR(100), Price DECIMAL(10, 2), CHECK (Price >= 0) );
|
这个约束确保产品价格不能为负数。
2. 多条件检查
1 2 3 4 5 6 7 8
| CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), Age INT, Salary DECIMAL(10, 2), CHECK (Age >= 18 AND Age <= 65 AND Salary > 0) );
|
这个约束确保员工年龄在18到65之间,且薪水为正数。
3. 日期逻辑检查
1 2 3 4 5 6 7
| CREATE TABLE Projects ( ProjectID INT PRIMARY KEY, ProjectName VARCHAR(100), StartDate DATE, EndDate DATE, CHECK (EndDate > StartDate) );
|
这个约束确保项目的结束日期晚于开始日期。
4. 字符串模式匹配
1 2 3 4 5 6
| CREATE TABLE Users ( UserID INT PRIMARY KEY, Username VARCHAR(50), Email VARCHAR(100), CHECK (Email LIKE '%@%.%') );
|
这个约束使用LIKE操作符来确保邮箱地址至少包含一个@符号和一个点。
5. 条件分支检查
1 2 3 4 5 6 7 8 9 10
| CREATE TABLE Orders ( OrderID INT PRIMARY KEY, OrderDate DATE, ShippingDate DATE, Status VARCHAR(20), CHECK ( (Status = 'Shipped' AND ShippingDate IS NOT NULL) OR (Status != 'Shipped' AND ShippingDate IS NULL) ) );
|
这个复杂的约束确保只有状态为”已发货”的订单才能有发货日期。
6. 使用函数的检查
1 2 3 4 5 6 7
| CREATE TABLE Students ( StudentID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), FullName VARCHAR(100), CHECK (FullName = CONCAT(FirstName, ' ', LastName)) );
|
这个约束确保FullName列总是FirstName和LastName的组合。
7. 跨列比较
1 2 3 4 5 6 7
| CREATE TABLE SalaryHistory ( EmployeeID INT, Year INT, OldSalary DECIMAL(10, 2), NewSalary DECIMAL(10, 2), CHECK (NewSalary > OldSalary) );
|
这个约束确保新工资总是高于旧工资。
8. 自定义命名的CHECK约束
1 2 3 4 5 6
| CREATE TABLE Inventory ( ItemID INT PRIMARY KEY, Quantity INT, ReorderPoint INT, CONSTRAINT chk_reorder_point CHECK (Quantity >= ReorderPoint) );
|
这个例子展示了如何给CHECK约束命名,使其更易于管理和引用。