DBMS笔记 07 数据库完整性
数据库完整性用于保证数据的正确性与一致性,主要通过实体完整性(主键)、参照完整性(外键)和用户自定义约束来实现。 当基础约束不足时,可通过触发器在 INSERT、UPDATE、DELETE 操作中实现更复杂的业务规则与数据校验。
DBMS笔记 07 数据库完整性
第七章 数据库完整性
一、完整性基本概念
- 完整性:保证数据的正确性和相容性。
- RDBMS 提供的三类约束:
- 实体完整性:行级唯一标识(主键不允许空值或重复)。
- 参照完整性:外键必须引用已有主键值或为空。
- 用户自定义完整性:结合具体应用需求的规则(如成绩范围、性别限定)。
- 安全性即防止未授权访问;完整性即防止错误数据进入。
二、实体完整性
- PRIMARY KEY 用来唯一标识一条记录,不能为空、不能重复。
- 主键定义两种方式:
- 列级约束:
Sno CHAR(9) PRIMARY KEY - 表级约束:
PRIMARY KEY (Sno)
- 列级约束:
- 复合主键:如
PRIMARY KEY(Sno, Cno)。
三、参照完整性
- 外键约束:
FOREIGN KEY (列) REFERENCES 表(主键) - 外键引用条件:要么为 NULL,要么等于被参照表的主键值。
违反参照完整性时的处理方式
- 拒绝执行 (NO ACTION) —— 默认,不允许操作。
- 级联 (CASCADE) —— 修改/删除主表记录时,子表也随之修改/删除。
- 设置为空 (SET NULL) —— 子表对应外键值置空。
- 外键能否取空?能,但不能取非法值。
四、用户自定义完整性
- 常见约束条件:
- NOT NULL:列不能为空
- UNIQUE:值唯一
- CHECK:范围检查,如
CHECK (Ssex IN ('男','女'))
- 修改/添加约束:
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK (Ssex IN ('男','女'));
五、触发器(Trigger)
用于定义更复杂的完整性和业务规则。
定义方式
CREATE TRIGGER 触发器名
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <条件>]
BEGIN
-- 动作 SQL
END;
特点
- 触发事件:INSERT / UPDATE / DELETE
- 触发时间:BEFORE / AFTER / INSTEAD OF(默认 AFTER)
- 触发范围:FOR EACH ROW(逐行)或 FOR EACH STATEMENT(整句一次)。
- 触发器可引用:
OLD(修改前)和NEW(修改后)的值。
例子
- 限制工资:
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
FOR EACH ROW
WHEN (new.Sal < 4000)
BEGIN
SET new.Sal = 4000;
END;
- 成绩变动记录:
CREATE TRIGGER SC_T
AFTER UPDATE OF Grade ON SC
FOR EACH ROW
INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade)
VALUES (old.Sno, old.Cno, old.Grade, new.Grade);
删除触发器
DROP TRIGGER 触发器名 ON 表名;
六、重点总结
- 完整性分为三类:实体完整性、参照完整性、用户自定义完整性。
- 实体完整性靠 主键/候选键 实现。
- 参照完整性靠 外键 实现。
- 用户自定义完整性常用 CHECK、NOT NULL、UNIQUE。
- 触发器可实现更复杂的完整性检查,支持 INSERT、UPDATE、DELETE 三类事件。
- 判断题常考:
- “所有约束必须在表创建时定义” → 错(可用 ALTER TABLE 添加)。
- “外键可以为空” → 对。
- “完整性与安全性等价” → 错。
七、速记
- 三大类约束:实体完整性(主键)、参照完整性(外键)、用户自定义(CHECK)。
- 主键:唯一+非空;外键:引用主键或 NULL。
- 三种外键处理:NO ACTION、CASCADE、SET NULL。
- 自定义约束:NOT NULL、UNIQUE、CHECK。
- 触发器:BEFORE/AFTER/INSTEAD OF + INSERT/UPDATE/DELETE。
本文由作者按照 CC BY-NC 4.0. 进行授权
...

Comments
评论区