数据库系统概论——第五章 数据库完整性

数据库系统概论——第五章 数据库完整性

零. 引言
(1)数据库的完整性:
正确性:是指数据是符合现实世界语义,反映了当前实际状况的
相容性:是指数据库同一对象在不同关系表中的数据是符合逻辑的
(2)完整性与安全性区别:
完整性:防范对象是不合语义的、不正确的数据
安全性:防范对象是非法用户和非法操作。
(3)为维护数据库的完整性,DBMS必须:
1)提供定义完整性约束条件的机制。
2)提供完整性检查的方法:一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可以在事务提交时检查
3)违约处理 :数据库管理系统若发现用户的操作违背了完整性约束条件,就采取一定的动作
拒绝(NO ACTION)执行该操作
级连(CASCADE)执行其他操作

一. 实体完整性
1. 实体完整性定义
(1)关系模型中的实体完整性
create table 中用primary key定义
(2)单属性构成的码由两种说明
定义为列级约束条件
定义为表级约束条件
(3)对多个属性构成的码只有一种说明方法
定义为表级约束条件

在这里插入图片描述
在这里插入图片描述

2. 实体完整性检查和违约处理
(1)插入或对主码列进行更新操作时,关系数据库管理系统按照实体完整性规则自动进行检查。包括:
1)检查主码值是否唯一,如果不唯一则拒绝插入或修改
2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
(2)检查记录中主码值是否唯一的一种方法是进行全表扫描:依次判断表中每一条记录的主码值与将插入记录上的主码值(或者修改的新主码值)是否相同 ,这种方法费时,为避免对基本表进行全表扫描,RDBMS核心一般都在主码上自动建立一个索引

在这里插入图片描述
二、 参照完整性

  1. 参照完整性定义
    在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
    用REFERENCES短语指明这些外码参照哪些表的主码
  2. 参照完整性检查和违约处理
    一个参照完整性将两个表中的相应元组联系起来
    对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查

在这里插入图片描述
(1)拒绝(no action)执行
不允许该操作执行。该策略一般设置为默认策略
(2)级联(caseade)操作
当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或修改参照表中的所有造成不一致的元组
(3)设置为空值
当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。

对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值

显示地说明参照完整性的违约处理示例

三、用户定义的完整性

用户定义的完整性是:针对某一具体应用的数据必须满足的语义要求
关系数据库管理系统提供了定义和检验用户定义完整性的机制,不必由应用程序承担

  1. 属性上的约束条件
    (1)create table时定义属性上的约束条件
    1)not null 列值不为空
    2)unique 列值唯一
    3)check 检查列值是否满足一个条件表达式

    在这里插入图片描述

    在这里插入图片描述
    (2)属性上的约束条件检查和违约处理
    插入元组或修改属性的值时,关系数据库管理系统检查属性上的约束条件是否被满足
    如果不满足则操作被拒绝执行

  2. 元祖上的约束条件
    (1)在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制
    同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件

    (2)元组上的约束条件检查和违约处理
    插入元组或修改属性的值时,关系数据库管理系统检查元组上的约束条件是否被满足
    如果不满足则操作被拒绝执行

四、完整性约束命名子句

  1. 完整性约束命名子句
    constraint<完整性约束条件名><完整性约束条件>
    <完整性约束条件>包括:not null、unique、ptimary key短语、foreign key短语、check 短语等
    在这里插入图片描述

  2. 修改完整性约束
    (1)去掉完整性约束(以下方法mysql8不适用)在这里插入图片描述
    (2)修改完整性约束(先删除 后增加)

五、 断言(mysql现在还不支持断言)

  1. SQL中,可以使用 CREATE ASSERTION语句,通过声明性断言来指定更具一般性的约束。
    2.可以定义涉及多个表的或聚集操作的比较复杂的完整性约束。
    3.断言创建以后,任何对断言中所涉及的关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行
  1. 创建断言的语句格式

eg:限制数据库课程最多60名学生选修

在这里插入图片描述
2. 删除断言的语句格式

六、触发器

1. 概念
触发器(tigger)是用户定义在关系表上的一类由事件驱动的特殊过程
(1)触发器保存在数据库服务器中
(2)任何用户对表的增、删、改操作均有服务器自动激活相应的触发器
(3)触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力

2. 定义触发器

触发器又叫做事件-条件-动作(event-condition-action)规则。
当特定的系统事件发生时,对规则的条件进行检查,如果条件成立则执
行规则中的动作,否则不执行该动作。规则中的动作体可以很复杂,通
常是一段SQL存储过程。

SQL标准
create tigger<触发器名>
{before|after}<触发事件> on <表名>
referencing new|old row as <变量>
for each{row|statement}
[with<触发条件>]<触发动作体>

定义触发器的语法说明
(1)表的拥有者才可以在表上创建触发器
(2)触发器名
触发器名可以包含模式名,也可以不包含模式名
同一模式下,触发器名必须是唯一的
触发器名和表名必须在同一模式下
(3)表名
触发器只能定义在基本表上,不能定义在视图上
当基本表的数据发生变化时,将激活定义在该表上相应触 发事件的触发器
(4)触发事件
触发事件可以是INSERT、DELETE或UPDATE也可以是这几个事件的组合
还可以UPDATE OF<触发列,…>,即进一步指明修改哪些列时激活触发器
AFTER/BEFORE是触发的时机
AFTER表示在触发事件的操作执行之后激活触发器
BEFORE表示在触发事件的操作执行之前激活触发器

(5)触发器类型
行级触发器(FOR EACH ROW)
语句级触发器(FOR EACH STATEMENT)

例如,在例TEACHER表上创建一个AFTER UPDATE触发器触发事件是UPDATE语句:
UPDATE TEACHER SET Deptno=5;
假设表TEACHER有1000行
如果是语句级触发器,那么执行完该语句后,触发动作只发生一次
如果是行级触发器,触发动作将执行1000次

(6)触发条件
1)触发器被激活时,只有当触发条件为真时触发动作2)体才执行;否则触发动作体不执行。
如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行
(7)触发动作体
1)触发动作体可以是一个匿名PL/SQL过程块也可以是对已创建存储过程的调用
2)如果是行级触发器,用户都可以在过程体中使用NEW和OLD引用事件之后的新值和事件之前的旧值
3)如果是语句级触发器,则不能在触发动作体中使用NEW或OLD进行引用

4)如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化

eg:当对表SC的Grade属性进行修改时,若分数增加了10%则将此次操作记录到下面表中:

3. 激活触发器
触发器的执行,是由触发事件激活的,并由数据库服务器自动执行
一个数据表上可能定义了多个触发器,遵循如下的执行顺序:
(1) 执行该表上的BEFORE触发器;
(2) 激活触发器的SQL语句;
(3) 执行该表上的AFTER触发器。

4. 删除触发器

触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。

发布了34 篇原创文章 · 获赞 4 · 访问量 1329

猜你喜欢

转载自blog.csdn.net/zj20165149/article/details/104052583