文章

DBMS笔记 07 数据库完整性

数据库完整性用于保证数据的正确性与一致性,主要通过实体完整性(主键)、参照完整性(外键)和用户自定义约束来实现。 当基础约束不足时,可通过触发器在 INSERT、UPDATE、DELETE 操作中实现更复杂的业务规则与数据校验。

DBMS笔记 07 数据库完整性

第七章 数据库完整性

一、完整性基本概念

  • 完整性:保证数据的正确性相容性
  • RDBMS 提供的三类约束:
    1. 实体完整性:行级唯一标识(主键不允许空值或重复)。
    2. 参照完整性:外键必须引用已有主键值或为空。
    3. 用户自定义完整性:结合具体应用需求的规则(如成绩范围、性别限定)。
  • 安全性即防止未授权访问;完整性即防止错误数据进入。

二、实体完整性

  • PRIMARY KEY 用来唯一标识一条记录,不能为空、不能重复
  • 主键定义两种方式:
    1. 列级约束:Sno CHAR(9) PRIMARY KEY
    2. 表级约束:PRIMARY KEY (Sno)
  • 复合主键:如 PRIMARY KEY(Sno, Cno)

三、参照完整性

  • 外键约束:FOREIGN KEY (列) REFERENCES 表(主键)
  • 外键引用条件:要么为 NULL,要么等于被参照表的主键值。

违反参照完整性时的处理方式

  1. 拒绝执行 (NO ACTION) —— 默认,不允许操作。
  2. 级联 (CASCADE) —— 修改/删除主表记录时,子表也随之修改/删除。
  3. 设置为空 (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 表名;

六、重点总结

  1. 完整性分为三类:实体完整性、参照完整性、用户自定义完整性
  2. 实体完整性靠 主键/候选键 实现。
  3. 参照完整性靠 外键 实现。
  4. 用户自定义完整性常用 CHECK、NOT NULL、UNIQUE
  5. 触发器可实现更复杂的完整性检查,支持 INSERT、UPDATE、DELETE 三类事件。
  6. 判断题常考:
    • “所有约束必须在表创建时定义” → (可用 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

评论区

碎片之中

正在加载中...