跳到主要内容

SQL 约束

在SQL中,约束(Constraints)是用于限制表中数据的规则。它们确保数据的准确性和可靠性,防止无效数据进入数据库。约束可以在创建表时定义,也可以在表创建后通过修改表结构来添加。

为什么需要约束?

数据库中的数据通常需要满足特定的业务规则。例如,用户的电子邮件地址必须是唯一的,或者订单金额不能为负数。通过使用约束,我们可以确保这些规则在数据库层面得到强制执行,从而避免数据不一致或错误。

常见的SQL约束类型

以下是SQL中常见的约束类型:

  1. NOT NULL:确保列不能存储NULL值。
  2. UNIQUE:确保列中的所有值都是唯一的。
  3. PRIMARY KEY:唯一标识表中的每一行,且不能为NULL。
  4. FOREIGN KEY:确保一个表中的数据与另一个表中的数据匹配。
  5. CHECK:确保列中的值满足特定条件。
  6. DEFAULT:为列设置默认值。

1. NOT NULL约束

NOT NULL约束确保列不能存储NULL值。如果尝试插入NULL值,数据库将返回错误。

sql
CREATE TABLE Users (
UserID INT PRIMARY KEY,
Username VARCHAR(50) NOT NULL,
Email VARCHAR(100) NOT NULL
);

在上面的例子中,UsernameEmail列不能为NULL。

2. UNIQUE约束

UNIQUE约束确保列中的所有值都是唯一的。与PRIMARY KEY不同,UNIQUE约束允许NULL值。

sql
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100) NOT NULL,
SKU VARCHAR(50) UNIQUE
);

在这个例子中,SKU列的值必须是唯一的。

3. PRIMARY KEY约束

PRIMARY KEY约束唯一标识表中的每一行。它结合了NOT NULLUNIQUE的特性。

sql
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE NOT NULL,
CustomerID INT NOT NULL
);

OrderID列是主键,确保每一行都有一个唯一的标识符。

4. FOREIGN KEY约束

FOREIGN KEY约束用于在两个表之间建立关系。它确保一个表中的数据与另一个表中的数据匹配。

sql
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约束用于确保列中的值满足特定条件。

sql
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约束为列设置默认值。如果插入数据时没有为该列提供值,则将使用默认值。

sql
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE DEFAULT CURRENT_DATE,
CustomerID INT NOT NULL
);

在这个例子中,如果插入数据时没有提供OrderDate,则将使用当前日期作为默认值。

实际案例

假设我们正在设计一个简单的电子商务数据库。我们需要确保以下规则:

  1. 每个用户必须有唯一的电子邮件地址。
  2. 每个订单必须与一个有效的客户关联。
  3. 产品的库存数量不能为负数。

我们可以使用以下SQL语句来实现这些规则:

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)
);

在这个案例中,我们使用了UNIQUECHECKFOREIGN KEY约束来确保数据的完整性和一致性。

总结

SQL约束是确保数据库中数据完整性和一致性的重要工具。通过使用约束,我们可以防止无效数据进入数据库,并确保数据符合业务规则。本文介绍了常见的SQL约束类型,并通过实际案例展示了它们的使用方法。

提示

在实际开发中,合理使用约束可以大大减少数据错误的可能性。建议在设计数据库时,仔细考虑每个表所需的约束。

附加资源

练习

  1. 创建一个名为Students的表,包含StudentID(主键)、FirstNameLastNameAge(必须大于12岁)列。
  2. Students表中添加一个Email列,并确保每个学生的电子邮件地址是唯一的。
  3. 创建一个名为Courses的表,包含CourseID(主键)和CourseName列。然后创建一个名为Enrollments的表,包含EnrollmentID(主键)、StudentID(外键)和CourseID(外键)列。

通过完成这些练习,你将更好地理解SQL约束的使用方法。