第五章、数据库完整性
介绍
1、数据库完整性介绍
1、数据库的完整性:随机数的正确性、相容性
2、数据的正确性:数据是否符合现实时间语义
3、数据的相容性:数据库同一对象在不同关系表中的数据是符合逻辑的
4、希望建立表的时候,就拥有数据的完整性
2、数据的完整性和安全性的概念
1、数据的完整性
1、防止数据库拥有不符合语义数据,防止数据库存储不正确的数据
2、防范对象:不符合语义、不正确的数据
2、数据的安全性
1、不会数据库被恶意破坏、非法存取
2、防范对象:非法用户和非法操作
3、数据库完整性应具备的功能
1、提高定义完整性约束条件机制
1、也叫完整性规则,数据库中的数据必须满足语义约束条件
2、提供完整性检查的方法
1、一般在INSERT、UPDATE、DELETE语句执行后进行检查
2、也可以在事务提交时检查
3、违约处理
1、采用拒绝(NO ACTION)执行该操作
2、或级连(CASCADE)执行其他操作等方式保证完整性(一个数据被修改,其他相关数据页和该数据关系相连对应)
3、DELETE语句的时候,数据库系统可能会给定NULL
5.1、实体完整性
5.1.1、实体完整性定义
1、关系模型的实体完整性
1、设置主码,用来数据区分
2、SQL语法:PRIMARY KEY
2、主码是单属性构成的有两种说明方法
1、定义为列级约束条件
2、定义表级约束条件(在一个表格中,对其中一列做主码)
3、主码是多属性的只能有一种说明方法
1、定义为表级约束条件
4、例子
1、例子1

5.1.2、实体完整性检查和违约处理
1、完整性内容检查
1、数据库系统按照规则,对数据进行自动检查
1、主要包括:
1、主码是否唯一,不唯一就错误或拒绝
2、主码的属性值,是否为空,有就直接拒绝或修改掉
2、检查主码值方法
1、方法
1、是进行全表扫描(遍历)
2、图解

2、说明
1、全表扫描十分浪费资源
2、RDBMS会在主码上自动建立一个索引
5.2、参照完整性
5.2.1、参照完整性定义
1、定义
1、格式
FOREIGN KEY 定义
用REFERENCES短语知名这些外码是参照哪些表的主码
2、例子

5.2.2、参照完整性检查和违约处理
1、定义
1、一个参照完整性将两个表中的相应元组联系起来,对被参照表和参照表进行操作(增删改查)时会破坏参照完整性,所以需要检查
2、例子

3、参照完整性违约处理规则
1、拒绝(NO ACTION)
1、不允许执行该操作,一般为默认
2、级联(CASCADE)
1、系统会把不一致的数据全部修改为一致的操作
3、空值(SET-NULL)
1、当造成不一致的时候,系统会把不一致的值设置为NULL
5、例子

5.3、用户定义的完整性
1、针对某一具体应用数据,必须满足语义要求
2、由数据库系统提供了定义检验用户定义完整性的机制,不是程序承担
5.3.1、属性定义的约束条件
1、定义
1、列值非空(NOT NULL)、唯一(UNIQUE)、是否满足一个表达式(CHECK)
1、例子

2、属性上的约束条件检查和违约处理
1、数据库系统进行检查,如果不满足则操作被拒绝执行
5.3.2、元组上的约束条件
1、 定义
1、在CREATE TABLE 中,可以使用CHECK短语,定义元组上的约束条件
2、可以设置在不同属性之间的取值相互约束条件
3、例子

2、元组上约束条件检查和违约处理
1、数据库系统进行检查,如果不满足则操作被拒绝执行
5.4、完整性约束命名子句
1、完整性约束命名子句
1、格式
CONSTRAINT<完整性约束条件名> <完整性约束条件>
1、其中完整性约束条件包括NOT NULL;UNIQUE;PRIMARY KEY;FOREIGN KEY;CHECK
2、例子

2、修改表中的完整性限制
1、格式
ALTER TABLE进行修改
2、例子

5.5、域中的完整性限制
5.5.1、内容
1、域:一列数据的取值范围,相同数据类型的集合
5.5.2、语法
1、语法
CREATE DOMAIN语句
2、例子
1、例子

2、例子

5.6、断言
1、创建断言的语句格式
1、格式
CREATE ASSERTION <断言名><CHECK 子句>
2、check中的约束条件与where子句的条件表达式类似
2、例子
1、例子1

2、例子2

3、例子3

4、例子4

2、删除断言
1、格式
DROP ASSERTION <断言名>;
1、开销占资源较高,一般不建议用
5.7、触发器
1、介绍
1、触发器是用户定义在关系表上的一类由事件驱动的特殊过程
2、说明
1、触发器保存在数据库服务器中
2、任何用户的增删改操作,由服务器自动激活触发器
3、触发器可以实施更为复杂的检查和操作,具有更精细和强大的数据控制能力
5.7.1、定义触发器
1、触发器又叫事件-条件-动作
1、格式
CREATE TRIGGER <触发器名称>
{BEFORE |AFTER} <触发事件> ON <表名>
REFERENCING NEW | OLD ROW AS <变量>
FROM EACH {ROW | STATEMENT}
[WHEN <触发条件>] <触发动作提>
2、定义触发器的语法说明
1、必须是表的拥有者
2、触发器名
1、触发器可以包含模式名,也可以不包含
2、在同一模式下触发器必须唯一
3、表名
1、触发器只能定义在基本表上,不能定义在视图
2、如果基本表发生变化,则对应的触发器也会被激活
4、事件触发
1、insert/delete/update这几个事件组合
2、update of<触发列,…>,即进一步知明修改哪些列时机会触发器
3、AFTER:事件完成后才激活触发器
4、BEFORE:时间触发前,激活触发器
5、触发器类型
1、行级触发器(FOR EACH ROW)
2、语句级触发器(FOR EACH STATEMENT)
3、例子

6、触发条件
1、触发体动作为真时,触发动作体才执行,否则触发动作体不执行
2、如果没有WHEN触发条件,则触发体动作在触发器激活后立即执行
7、触发动作体
1、可以是匿名PL/SQL过程块,也可以是对自己创建存储过程的调整
2、如果是行级触发器,用户都可以在过程体中使用new 和old引用事件之后的新值和事件之前的旧值
3、如果语句触发器,则不能在触发动作提化总使用new和old
4、如果触发器动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响其他对象不发生任何变化
5、注意:不同的RDBMS产品触发器语法各部相同
6、例子1
7、例子2
5.7.2、激活触发器
1、一个数据可能有多个触发器,触发遵循以下顺序
1、执行该表上的BEFORE触发器
2、激活触发器的SQL雨具
3、执行该表上的AFTER触发器
5.7.3、删除触发器
1、语法格式
1、格式
DROP TRIGGER <触发器名> ON <表名>
2、必须有,才能删除
5.8、小结
1、完整性是我了保证数据库存储的数据是正确的;最重要的是实体完整性和参照完整性
2、完整性定义一般有SQL的数据定义语言完成,现在提供了完整性的定义和检查
3、违背完整性约束条件时RDBMS采取默认动作
4、触发器是保证数据完整性的重要方法,一般不使用,大多数使用在大型的数据库项目中