数据库完整性

数据库的完整性是指数据的正确性和相容性。

实体完整性

保证实体可区分,主码(PRIMARY KEY)不可取空值。

参照完整性

对外码(FOREIGN KEY)的约束。
外码可以取空值或者等于原基本表中的某一元组的主码值。

用户定义的完整性

属性上的约束条件

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 检查列值是否满足一个条件表达式(CHECK 短语)

用CHECK短语指定列值应该满足的条件
例如:CHECK (Ssex IN (‘男’, ‘女’)) //检查性别是否为男或女,否则非法数据

断言

通过声明性断言来指定更具一般性的约束。断言创建以后,任何对段严重所涉及关系的操作都会出发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。

  1. 创建断言的语句格式
CREATE ASSERTION <断言名><CHECK子句>

CHECK子句中的约束条件与WHERE子句的条件表达式类似。
eg:限制每一门课程最多60人选修

CREATE ASSERTION ASSE_SC_CNUM1
     CHECK(60 >= ALL(SELECT count(*)
                     FROM SC
                     GROUP BY Cno)
                     );
  1. 删除断言
DROP ASSERTION <断言名>;

触发器

触发器又叫做事件-条件-动作(event-condition-action)规则。

建立触发器:
CREATE TRIGGER <触发器名>
{BEFORE|AFTER} <触发事件> ON <表名>
REFERENCING NEW|OLD ROW AS <变量>  /*REFERENCING指出引用的变量*/
FOR EACH{ROW|STATEMENT}
[WHEN <触发条件>]<触发动作体>

触发器按照所触发动作的间隔尺寸可以分为行级触发器(FOR EACH ROW)和语句级触发器(FOR EACH STATEMENT)。
在触发事件发生后,当且仅当触发条件为真时执行触发动作体,若省略了WHEN子句,则触发动作体立即执行。

激活触发器

同一个表上多个触发器激活时遵照如下的执行顺序:

  1. 执行该表上的BEFORE触发器
  2. 激活触发器的SQL语句
  3. 执行该表上的AFTER触发器
    对于同一类型触发器,按照触发器创建的时间先后执行。

删除触发器

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