avatar

目录
sql-check-constraint-examples

SQL CHECK 约束详细示例

1. 基本数值范围检查

sql
1
2
3
4
5
6
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100),
Price DECIMAL(10, 2),
CHECK (Price >= 0)
);

这个约束确保产品价格不能为负数。

2. 多条件检查

sql
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. 日期逻辑检查

sql
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. 字符串模式匹配

sql
1
2
3
4
5
6
CREATE TABLE Users (
UserID INT PRIMARY KEY,
Username VARCHAR(50),
Email VARCHAR(100),
CHECK (Email LIKE '%@%.%')
);

这个约束使用LIKE操作符来确保邮箱地址至少包含一个@符号和一个点。

5. 条件分支检查

sql
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. 使用函数的检查

sql
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. 跨列比较

sql
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约束

sql
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约束命名,使其更易于管理和引用。


评论