提供定义完整性约束条件的机制

提供完整性检查的方法

违约处理

实体完整性

实体完整性定义

  • 关系模型的实体完整性

    • 设置主码 PRIMARY KEY

实体完整性检查和违约处理

  • 完整性检查的内容

    • 检查主码值是否唯一
    • 检查主码的各个属性是否为空
  • 检查主码值方法

    • 全表扫描
    • B+数索引

参照完整性

参照完整性定义

  • 设置外码 FOREIGN KEY

参照完整性检查和违约处理

  • 修改参照表 – 违约处理为 拒绝

  • 修改被参照表 – 违约处理为 拒绝/级联删除/设置为空值

  • 设置外码时可在后面显示指定违约处理方式

    1
    2
    3
    FOREIGN KEY (列名) REFERENCES <表名>(列名)
    ON <操作类型> CASCADE # 级联处理
    ON <操作类型> NO ACTION # 拒绝

用户定义的完整性

属性上的约束条件

  • 属性上约束条件的定义

    • 列值非空 NOT NULL
    • 列值唯一 UNIQUE
    • 检查列值是否满足一个条件 CHECK

元组上的约束条件

  • 元组上约束条件的定义

    • 表级上使用 CHECK

完整性约束命名子句

  • CONSTRAINT <约束名> <约束条件>

  • 修改表中的完整性限制

    • 使用 ALTER TABLE 语句修改表中的完整性限制
    • 可以先删除原来的约束条件, 再增加新的约束条件

断言

  • 创建断言的语句格式

    CREATE ASSERTION <断言句> <CHECK 子句>

    • <CHECK 子句> 中的约束条件与 WHERE 子句 的条件表达式类似

  • 删除断言

    DROP ASSERTION <断言名>

    • 开销较大

触发器

用户定义在关系表上的一类由事件驱动的特殊过程

  • 触发器保存在数据库服务器中

  • 任何用户对表的增删改查操作均由服务器自动激活触发器

定义触发器

  • 事件 - 条件 - 动作

  • 语句格式为

    1
    2
    3
    4
    5
    6
    CREATE TRIGGER <触发器名>
    [BEFORE|AFTER] <触发事件> ON <表名>
    REFERENCING
    NEW|OLD ROW AS <变量>
    FOR EACH [ROW|STATEMENT] # 触发器类型
    [WHEN <触发条件>] <触发动作体>
  • 定义触发器的语法说明

    • 表的拥有者才可以在表上创建触发器

    • 触发事件

      • INSERT DELETE UPDATE
      • UPDATE OF <触发列, ...> 进一步指明修改哪些列时激活触发器
    • 触发器类型

      • 行级触发器 FOR EACH ROW
      • 语句级触发器 FOR EACH STATEMENT
      • 注意区别
    • 触发条件

      • 只有当触发条件为真时触发动作体才执行
    • 触发动作体

      image-20250119202707440

  • 例子

    image-20250119202712208

激活触发器

  • 触发器的执行是由触发事件激活的, 并由数据库服务器自动执行

  • 一个数据表上可能定义了多个触发器, 则触发顺序为

    • 执行该表上的 BEFORE 触发器
    • 激活触发器的SQL语句
    • 执行该表上的 AFTER 触发器

删除触发器

  • DROP TRIGGER <触发器名> ON <表名>