一、关系数据库的完整性规则
-
参照完整性规则
- 外码(Foreign Key)可以与主码(Primary Key)不同名,但在实际应用中通常同名以增强可读性和识别性。
- 外码属性的取值必须满足以下两类之一:
- 空值(NULL),表示尚未分配或无关联;
- 必须是被参照关系中某个元组的主码实际存在的值,禁止引用不存在的主码值。
- 对于由多个属性构成的主键(如“学号+课程号”组成的连接关系),这些主属性不仅需满足实体完整性(即不能取空值),还必须满足参照完整性,因此只能取被参照表中存在的组合主码值。
- 在同一关系内部存在自参照时(例如“学生”关系中的“班长”属性指向本表的“学号”),其值可为空(表示暂无班长),或为本关系中某一元组的有效主码值。
-
用户定义的完整性规则
- 根据具体应用场景设定的语义约束,如:
- 属性唯一性(UNIQUE);
- 取值范围限制(如成绩在0~200之间);
- 是否允许空值(NOT NULL)。
- 这些规则也称为“域完整性规则”,用于限定属性的取值类型、格式、范围及约束条件。
- 包括两种类型的取值范围:
- 静态约束:固定值集合(如性别只能为‘男’或‘女’);
- 动态约束:依赖于其他属性或其他记录的状态(如入学年份不得晚于当前年份)。
- 根据具体应用场景设定的语义约束,如:
-
操作时的完整性检查
- 插入操作:依次检查三项完整性:
- 实体完整性(主键非空且唯一);
- 参照完整性(外键合法);
- 用户定义完整性(符合自定义约束)。
若任一项不满足,则拒绝插入,或对不符合的外键设为空(若允许)。
- 删除操作:当试图删除一个被外码引用的主码记录时,DBMS 提供多种处理策略:
- 拒绝删除(RESTRICT)—— 默认方式,防止破坏参照完整性;
- 置空删除(SET NULL)—— 将引用该主码的外码字段设为空;
- 级联删除(CASCADE)—— 同时删除所有引用此主码的相关记录。
- 更新操作:逻辑上等价于“先删除旧值 + 再插入新值”。
因此需要同时满足删除和插入的完整性检查规则,尤其是对外码引用的影响要进行完整评估。
- 插入操作:依次检查三项完整性:
二、SQL 语言简介
-
SQL(Structured Query Language,结构化查询语言)是用于关系数据库的标准语言,具备以下四大功能集成:
- 数据定义(DDL:Data Definition Language)—— 创建、修改、删除数据库对象(如表、索引、视图);
- 数据操纵(DML:Data Manipulation Language)—— 查询、插入、更新、删除数据;
- 数据控制(DCL:Data Control Language)—— 权限管理(GRANT、REVOKE);
- 事务控制(TCL:Transaction Control Language)—— COMMIT、ROLLBACK 等。
-
核心特点为“综合统一”:
- 一套语言即可完成数据库全生命周期的操作,无需切换工具或语法体系;
- 支持从创建数据库模式(CREATE SCHEMA)、建表(CREATE TABLE)、授权(GRANT)、查询(SELECT)、到维护数据一致性的完整流程。
-- 示例:创建学生表并定义完整性约束
CREATE TABLE Student (
学号 CHAR(10) PRIMARY KEY,
姓名 VARCHAR(20) NOT NULL,
专业号 CHAR(6),
班长 CHAR(10),
FOREIGN KEY (专业号) REFERENCES Major(专业号),
FOREIGN KEY (班长) REFERENCES Student(学号)
ON DELETE SET NULL
ON UPDATE CASCADE
);
-- 插入数据时需满足所有完整性规则
INSERT INTO Student (学号, 姓名, 专业号, 班长)
VALUES ('20230001', '张三', 'CS01', '20230002'); -- 要求'CS01'在Major中存在,'20230002'是已有学生
在 SQL 中,级联删除(CASCADE DELETE) 和 级联更新(CASCADE UPDATE) 是通过外键约束中的 ON DELETE CASCADE 和 ON UPDATE CASCADE 子句实现的。它们用于维护参照完整性的同时,自动传播对被引用记录的操作到依赖记录。
一、语法实现
CREATE TABLE 父表 (
主码 INT PRIMARY KEY,
数据 VARCHAR(50)
);
CREATE TABLE 子表 (
ID INT PRIMARY KEY,
外码 INT,
FOREIGN KEY (外码) REFERENCES 父表(主码)
ON DELETE CASCADE -- 删除父表记录时,自动删除子表相关记录
ON UPDATE CASCADE -- 更新父表主码时,自动更新子表外码值
);
⚠️ 注意:主码一般不应被更新,但在支持的情况下(如使用代理键或业务键变更),
ON UPDATE CASCADE可确保数据一致性。
二、示例说明
假设有一个“部门-员工”关系:
-- 部门表(主表)
CREATE TABLE Department (
DeptID CHAR(3) PRIMARY KEY,
DeptName VARCHAR(20) NOT NULL
);
-- 员工表(从表),外键指向 Department
CREATE TABLE Employee (
EmpID INT PRIMARY KEY,
Name VARCHAR(30),
DeptID CHAR(3),
FOREIGN KEY (DeptID) REFERENCES Department(DeptID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
场景1:级联删除
DELETE FROM Department WHERE DeptID = 'D01';
→ 所有 DeptID = 'D01' 的员工记录也会被自动删除。
场景2:级联更新
UPDATE Department SET DeptID = 'D99' WHERE DeptID = 'D01';
→ 所有原 DeptID = 'D01' 的员工记录的 DeptID 自动更新为 'D99'。
三、适用场景
| 场景 | 描述 |
|---|---|
| 1. 层次化数据结构 | 如组织架构中“部门 → 员工”,删除一个部门时,其下属员工也应一并清理或重新分配(若允许级联则直接删除)。 |
| 2. 主从表关系(如订单与订单项) | 删除“订单”时,其所有“订单明细”应自动删除,避免产生孤立记录。 |
| 3. 逻辑主键变更需求 | 当业务主键(非自增ID)可能更改时(如项目编号调整),使用 ON UPDATE CASCADE 可保持引用一致。 |
| 4. 临时/附属数据管理 | 如用户上传的文件、日志等,当用户被删除时,相关资源记录可随之一同清除。 |
四、注意事项
- ✅ 优点:简化应用逻辑,保障数据一致性。
- ❌ 风险:误删主记录可能导致大量关联数据被连带删除,造成不可逆损失。
- 🔐 建议:
- 在关键系统中谨慎使用
CASCADE; - 可结合触发器或应用程序层控制提供确认机制;
- 使用前充分评估数据依赖关系。
- 在关键系统中谨慎使用
五、不同 DBMS 支持情况
| 数据库 | 是否支持 ON DELETE CASCADE | 是否支持 ON UPDATE CASCADE |
|---|---|---|
| MySQL | ✅ | ✅ |
| PostgreSQL | ✅ | ✅ |
| SQL Server | ✅ | ✅ |
| Oracle | ✅ | ✅ |
| SQLite | ✅(需启用外键) | ✅ |
SQLite 默认关闭外键支持,需执行:
PRAGMA foreign_keys = ON;


1907

被折叠的 条评论
为什么被折叠?



