数据库的完整性指的就是数据的正确性和相容性。数据的正确性是指数据是符合世界语义、反映当前实际状况的;数据的相容性就是指数据库在同一对象在不同关系表中的数据是符合逻辑的。
DBMS必须能够实现如下功能:
- 提供定义完整性约束条件的机制(SQL中的DDL语句、立法)
- 提供完整性检查的方法(什么时候检查、怎么检查、执法)
- 进行违约处理
5.1 实体完整性
5.1.1 定义实体完整性
CREATE TABLE中的PRIMARY KEY定义
- 列级约束条件(单属性主码才可以在列级定义)
- 表级约束条件(多个属性构成的码的唯一定义方法)
5.1.2 实体完整性检查和违约处理
用PRIMARY KEY短语定义了关系的主码之后,每当用户程序对基本表插入一条记录或对主码进行更新操作时,关系数据库管理系统DBMS将按照定义的实体完整性规则进行自动检查:
- 检查主码值是否唯一;如果不唯一则拒绝插入或者修改
- 检查主码的各个属性值是否为空,只要一个为空就拒绝修改或者插入。
5.2 参照完整性
5.2.1 定义参照完整性
在CREATE TABLE中用FOREIGN KEY定义哪些为外码,用REFERENCES指明这些外码参照哪些表的主码。
5.2.2 参照完整性检查和违约处理
- SC表中增加一个元组,该元组的Sno属性值在表Student中找不到一个元组,其属性值与之相等。
2)修改SC表中的一个元组,该元组的Sno属性值在表Student中找不到一个元组,其属性值与之相等。
3)从Studnet表中删除一个元组,造成SC表中某些元组的Sno属性值在表Studnet中找不到一个元组,其Sno属性值与之相等。
4)修改Student表中一个元组的属性值,造成SC表中某些元组的Sno属性值在表Studnet中找不到一个元组,其Sno属性值与之相等。
当上述的不一致发生的时候,系统可以采用以下策略进行加以处理:
- 拒绝(NO ACTION)执行
- 级联(CASCADE)操作
- 设置为空值
5.3 用户定义完整性
5.7 触发器
触发器是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,触发器将保存在数据库服务器中。任何用户对表的增、删、改、查操作均由服务器自动激活的触发器,在关系数据系统核心层进行集中的完整性控制。触发器类似于约束但是比约束更加灵活。
5.7.1 定义触发器
触发器又叫做事件-条件-动作规则:当特定的系统事件发生时,对规则的条件进行检查,条件成立则执行规则中的动作。
- 只有表的拥有者/DA才能创建触发器,一个表只能创建一定数量的触发器
- 同一模式下,触发器名必须是唯一的,并且触发器名和表名必须在同一模式下。
- 触发器只能定义在基本表上,不能定义在视图上。但是触发器的动作不局限在一张表
- AFTER/BEFORE是触发的时机
- 触发器类型:行级触发器、列级触发器
- 如果触发动作体执行失败,激活触发器的事件就会终止执行。
5.7.2 激活触发器
触发器激活时遵循如下的执行顺序:
- 执行该表上的BEFORE触发器
- 激活触发器的SQL语句
- 执行该表上的AFTER触发器。
对于同一个表上的多个BEFRE(AFTER)触发器,遵循“谁先创建谁先执行”的原则。