SQL 约束
在SQL中,约束(Constraints)是用于限制表中数据的规则。它们确保数据的准确性和可靠性,防止无效数据进入数据库。约束可以在创建表时定义,也可以在表创建后通过修改表结构来添加。
为什么需要约束?
数据库中的数据通常需要满足特定的业务规则。例如,用户的电子邮件地址必须是唯一的,或者订单金额不能为负数。通过使用约束,我们可以确保这些规则在数据库层面得到强制执行,从而避免数据不一致或错误。
常见的SQL约束类型
以下是SQL中常见的约束类型:
- NOT NULL:确保列不能存储NULL值。
- UNIQUE:确保列中的所有值都是唯一的。
- PRIMARY KEY:唯一标识表中的每一行,且不能为NULL。
- FOREIGN KEY:确保一个表中的数据与另一个表中的数据匹配。
- CHECK:确保列中的值满足特定条件。
- DEFAULT:为列设置默认值。
1. NOT NULL约束
NOT NULL
约束确保列不能存储NULL值。如果尝试插入NULL值,数据库将返回错误。
CREATE TABLE Users (
UserID INT PRIMARY KEY,
Username VARCHAR(50) NOT NULL,
Email VARCHAR(100) NOT NULL
);
在上面的例子中,Username
和Email
列不能为NULL。
2. UNIQUE约束
UNIQUE
约束确保列中的所有值都是唯一的。与PRIMARY KEY
不同,UNIQUE
约束允许NULL值。
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100) NOT NULL,
SKU VARCHAR(50) UNIQUE
);
在这个例子中,SKU
列的值必须是唯一的。
3. PRIMARY KEY约束
PRIMARY KEY
约束唯一标识表中的每一行。它结合了NOT NULL
和UNIQUE
的特性。
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE NOT NULL,
CustomerID INT NOT NULL
);
OrderID
列是主键,确保每一行都有一个唯一的标识符。
4. FOREIGN KEY约束
FOREIGN KEY
约束用于在两个表之间建立关系。它确保一个表中的数据与另一个表中的数据匹配。
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE NOT NULL,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
在这个例子中,CustomerID
列是Orders
表的外键,它引用了Customers
表中的CustomerID
列。
5. CHECK约束
CHECK
约束用于确保列中的值满足特定条件。
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
Age INT CHECK (Age >= 18)
);
在这个例子中,Age
列的值必须大于或等于18。
6. DEFAULT约束
DEFAULT
约束为列设置默认值。如果插入数据时没有为该列提供值,则将使用默认值。
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE DEFAULT CURRENT_DATE,
CustomerID INT NOT NULL
);
在这个例子中,如果插入数据时没有提供OrderDate
,则将使用当前日期作为默认值。
实际案例
假设我们正在设计一个简单的电子商务数据库。我们需要确保以下规则:
- 每个用户必须有唯一的电子邮件地址。
- 每个订单必须与一个有效的客户关联。
- 产品的库存数量不能为负数。
我们可以使用以下SQL语句来实现这些规则:
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
Email VARCHAR(100) NOT NULL UNIQUE
);
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100) NOT NULL,
StockQuantity INT CHECK (StockQuantity >= 0)
);
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE DEFAULT CURRENT_DATE,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
在这个案例中,我们使用了UNIQUE
、CHECK
和FOREIGN KEY
约束来确保数据的完整性和一致性。
总结
SQL约束是确保数据库中数据完整性和一致性的重要工具。通过使用约束,我们可以防止无效数据进入数据库,并确保数据符合业务规则。本文介绍了常见的SQL约束类型,并通过实际案例展示了它们的使用方法。
在实际开发中,合理使用约束可以大大减少数据错误的可能性。建议在设计数据库时,仔细考虑每个表所需的约束。
附加资源
练习
- 创建一个名为
Students
的表,包含StudentID
(主键)、FirstName
、LastName
和Age
(必须大于12岁)列。 - 在
Students
表中添加一个Email
列,并确保每个学生的电子邮件地址是唯一的。 - 创建一个名为
Courses
的表,包含CourseID
(主键)和CourseName
列。然后创建一个名为Enrollments
的表,包含EnrollmentID
(主键)、StudentID
(外键)和CourseID
(外键)列。
通过完成这些练习,你将更好地理解SQL约束的使用方法。