SQL约束条件
SQL约束条件[编辑 | 编辑源代码]
SQL约束条件(SQL Constraints)是应用于数据库表中列或表的规则,用于限制可以存储的数据类型。这些约束条件帮助维护数据的准确性、完整性和一致性,是关系型数据库设计的核心组成部分。
概述[编辑 | 编辑源代码]
SQL约束条件定义了数据库中数据的有效性和关系规则。它们可以应用于列级别(仅影响单个列)或表级别(影响多个列)。约束条件在创建表时定义(通过CREATE TABLE
语句),也可以在表创建后通过ALTER TABLE
语句添加。
主要的SQL约束条件包括:
NOT NULL
- 确保列不能存储NULL值UNIQUE
- 确保列中的所有值都不同PRIMARY KEY
- 唯一标识表中的每一行FOREIGN KEY
- 确保一个表中的数据匹配另一个表中的值CHECK
- 确保列中的值满足特定条件DEFAULT
- 为列设置默认值
详细约束类型[编辑 | 编辑源代码]
NOT NULL 约束[编辑 | 编辑源代码]
NOT NULL约束强制列不接受NULL值,这意味着必须始终包含一个值。
CREATE TABLE Employees (
EmployeeID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
在此示例中,EmployeeID、LastName和FirstName列不能包含NULL值,而Age列可以。
UNIQUE 约束[编辑 | 编辑源代码]
UNIQUE约束确保列中的所有值都不同。
CREATE TABLE Persons (
ID int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
或者使用表级约束:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
UNIQUE (ID)
);
PRIMARY KEY 约束[编辑 | 编辑源代码]
PRIMARY KEY约束唯一标识表中的每条记录。主键必须包含UNIQUE值且不能包含NULL值。
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
CustomerName varchar(255) NOT NULL,
ContactName varchar(255),
Country varchar(255)
);
对于复合主键:
CREATE TABLE OrderDetails (
OrderID int NOT NULL,
ProductID int NOT NULL,
Quantity int,
PRIMARY KEY (OrderID, ProductID)
);
FOREIGN KEY 约束[编辑 | 编辑源代码]
FOREIGN KEY约束用于防止破坏表之间链接的操作,它指向另一个表中的PRIMARY KEY。
CREATE TABLE Orders (
OrderID int NOT NULL PRIMARY KEY,
OrderNumber int NOT NULL,
CustomerID int,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
CHECK 约束[编辑 | 编辑源代码]
CHECK约束限制列中可以放置的值范围。
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
CHECK (Age>=18)
);
DEFAULT 约束[编辑 | 编辑源代码]
DEFAULT约束为列提供默认值。
CREATE TABLE Orders (
ID int NOT NULL,
OrderNumber int NOT NULL,
OrderDate date DEFAULT GETDATE()
);
约束的实际应用案例[编辑 | 编辑源代码]
用户注册系统[编辑 | 编辑源代码]
在一个用户注册系统中,我们可以使用多种约束来确保数据质量:
CREATE TABLE Users (
UserID int NOT NULL PRIMARY KEY,
Username varchar(50) NOT NULL UNIQUE,
Email varchar(100) NOT NULL UNIQUE,
PasswordHash varchar(255) NOT NULL,
RegistrationDate datetime DEFAULT CURRENT_TIMESTAMP,
Age int CHECK (Age >= 13),
CountryCode char(2) REFERENCES Countries(Code)
);
这个表定义使用了: 1. PRIMARY KEY约束确保每个用户有唯一标识 2. NOT NULL约束确保关键信息不缺失 3. UNIQUE约束防止用户名和邮箱重复 4. DEFAULT约束自动记录注册时间 5. CHECK约束确保用户年龄符合要求 6. FOREIGN KEY约束关联国家代码表
约束的添加与删除[编辑 | 编辑源代码]
添加约束[编辑 | 编辑源代码]
可以在表创建后添加约束:
ALTER TABLE Persons
ADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND Age<=120);
删除约束[编辑 | 编辑源代码]
要删除约束:
ALTER TABLE Persons
DROP CONSTRAINT CHK_PersonAge;
约束的级联操作[编辑 | 编辑源代码]
对于FOREIGN KEY约束,可以定义级联操作:
CREATE TABLE Orders (
OrderID int NOT NULL PRIMARY KEY,
CustomerID int NOT NULL,
OrderDate datetime,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
ON DELETE CASCADE
ON UPDATE NO ACTION
);
级联选项包括:
NO ACTION
- 默认,阻止删除/更新CASCADE
- 级联删除/更新相关行SET NULL
- 将外键值设为NULLSET DEFAULT
- 将外键值设为默认值
约束的性能考虑[编辑 | 编辑源代码]
虽然约束对于数据完整性至关重要,但它们确实会带来性能开销:
- 每次插入、更新或删除操作都需要验证约束
- 外键约束需要检查引用完整性
- 复杂的CHECK约束可能影响性能
在设计大型数据库时,需要在数据完整性和性能之间找到平衡。
约束的验证与禁用[编辑 | 编辑源代码]
在某些情况下(如大数据导入),可能需要临时禁用约束:
-- 禁用所有约束
ALTER TABLE Orders NOCHECK CONSTRAINT ALL;
-- 重新启用
ALTER TABLE Orders CHECK CONSTRAINT ALL;
-- 禁用特定约束
ALTER TABLE Orders NOCHECK CONSTRAINT FK_Orders_Customers;
总结[编辑 | 编辑源代码]
SQL约束条件是数据库设计的基础工具,它们确保:
- 数据的准确性和一致性(通过NOT NULL、CHECK等)
- 数据的唯一性(通过PRIMARY KEY、UNIQUE)
- 表之间的关系完整性(通过FOREIGN KEY)
- 合理的默认值(通过DEFAULT)
合理使用约束可以显著减少应用程序中的错误检查代码,将数据验证逻辑集中在数据库层。