5.0概述
- 数据库的完整性指数据的正确性和相容性。
- 数据的正确性是指数据符合现实世界语义。
- 数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。
- 完整性和安全性的区别:
- 完整性检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库。
- 安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取。
- 为维护数据库的完整性,数据库管理系统必须实现如下功能:
- 提供定义完整性约束条件的机制
- 提供完整性检查的方法
- 进行违约处理
5.1实体完整性
定义实体完整性:
- 关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。
- 单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。
- 对多个属性构成的码只有一种说明方法,即定义为表级约束条件。
实体完整性检查:
- 插入一条记录或对主码列进行更新操作时,会根据实体完整性规则进行检查:
- 检查主码值是否唯一
- 检查主码的各个属性是否为空
- 检查记录中主码值是否唯一的一种方法是进行全表扫描,十分耗时,所以一般都在主码上自动建立一个B+树索引。
5.2参照完整性
定义参照完整性:
- 关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。
- 在表级定义参照完整性:FOREIGN KEY (Cno) REFERENCES Course(Cno)
参照完整性检查:
- 可能破坏参照完整性的情况及违约处理:
-
- 对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值。
- 拒绝执行一般为默认的违约处理。
- 想让系统采用其它策略则必须在创建参照表时显式地加以说明。
5.3用户定义的完整性
- 用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。
属性上的约束条件:
- 在创建表定义属性时,可以根据应用要求定义属性上的约束条件,即属性值限制:
- 非空 NOT NULL
- 唯一 UNIQUE
- 检查列值是否满足条件表达式(CHECK短语指定列值应该满足的条件)
元组上的约束条件:
- 元组上约束条件的定义与属性上约束条件的定义类似,是元组级的限制。
- 元组级的限制可以设置不同属性之间的取值的相互约束条件。
5.4完整性约束命名子句
定义完整性约束命名子句:
- 句式:CONSTRAINT<完整性约束条件名><完整性约束条件>
- 完整性约束条件包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK短语等。
- 完整性约束命名子句在创建表(CREATE TABLE)时定义。
修改完整性限制:
- 使用ALTER TABLE语句修改表中的完整性限制。
- 删除原来的约束条件:DROP CONSTRAINT C1;
- 添加新的约束条件:ADD CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 999999);
5.5域中的完整性限制
- 建立域:
CREAT DOMAIN GenderDomain CHAR(2)
CHECK (VALUE IN ('男','女'));
- 建表时可以用域来说明一个属性的取值范围: Sex GenderDomain
- 对域的完整性限制可以在创建域的时候定义,定义与修改的方法和完整性约束命名子句相同。
5.6断言
- 通过声明性断言利来指定更具一般性的约束,可以定义设计多个表或聚集操作的比较复杂的完整性约束。
- 创建断言的语句格式:CREATE ASSERTION<断言名><CHECK 子句>
- CHECK子句中的条件与WHERE子句的条件表达式类似。
- 删除断言的语句格式:DROP ASSERTION<断言名>
5.7触发器
- 触发器:用户定义在关系表上的一类由事件驱动的特殊过程。
定义触发器:
- 触发器又叫做事件-条件-动作规则。
- 当特定事件发生时,对规则的条件进行检查,并决定是否执行规则中的动作。
- 建立触发器语句格式:
- 只有表的拥有者才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器。
- 同一模式下,触发器名必须是唯一的,并且触发器名和表名必须在同一模式下。
- 触发器只能定义在基本表上,不能定义在视图上。
- 触发事件可以是INSERT、DELETE、UPDATE。
- AFTER/BEFORE是触发的时机。
- 触发器按照所触发动作的间隔尺寸可以分为行级触发器和语句级触发器。
- 行级触发器可以在过程体中使用NEW和OLD引用事件前后的新旧值;语句级触发器不能使用。
- 如果触发动作体执行失败,激活触发器的事件就会终止执行。
激活触发器:
- 同一个表上的多个触发器激活时遵循如下执行顺序:
- 执行该表上的BEFORE触发器
- 激活触发器的SQL语句
- 执行该表上的AFTER触发器
- 相同类型的触发器按照创建的时间先后顺序执行。
删除触发器:
- 删除触发器语法:DROP TRIGGER <触发器名> ON <表名>;