第二章 数据库的完整性控制
数据完整性(Data Integrity)是指数据的精确性(accuracy)和可靠性(reliability),它是防止数据库中存在不符合语义规定的数据和防止因错误的信息的输入造成无效操作或错误信息而提出的,保证在一个应用程序更新数据的过程中数据的语义正确性。
数据完整性主要分为三类:实体完整性(Entity Integrity),参照完整性(Referential Integrity)以及用户定义的完整性(User-defined Integrity),其中用户定义的完整性主要包括域完整性(Domain Integrity)和其他自定义完整性。
为维护数据库德完整性,数据库管理系统(DBMS)必须提供一种机制来检查数据库中的数据,看其是否满足语义规定的条件。这些加在数据库数据上的语义约束条件称为数据库完整性规则,它们作为模式的一部分存入数据库中。
完整性控制是指对数据库进行更新操作,要遵守完整性规则,才能保证数据的语义正确性,防止数据库中存在不符合语义的数据。目的是在合法用户访问数据库的过程中,保证数据的正确性和准确性。完整性检查机制是指在DBMS中检查数据是否满足完整性条件的机制。由
DBMS在执行更新动作时,检查是否满足预定的完整性约束条件,来进行控制。广义的完整性控制包括故障恢复、并发控制。而一般所指的完整性控制是指基于数据库的完整性约束规则,如:实体完整性、引用完整性等。SQL中两种主要的数据完整性控制机制是指完整性约束规则的定义和检查以及触发器(Trigger)机制。
完整性控制机制应具有三个功能:
(1) 定义功能,即提供定义完整性约束条件的机制;
(2) 检查功能,即检查用户发出的操作请求书否违反了约束条件;
(3) 如果发现用户操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。
完整性控制机制的工作原理基本上分为两类,一种是定义完整性时就立刻进行检查的,例如实体完整性的定义;另外一种是定义完整性之后进行检查的,例如参照完整性的定义。
    SQL Server提供了一些工具来帮助用户实现数据完整性,其中最主要的是:规则(Rule),默认值(Default),约束(Constraint)和触发器(Trigger
实验报告2.1  实体完整性
实验目的
学习实体完整性的建立,以及实践违反实体完整性的结果。
实验原理
1、实体完整性(Entity Integrity)定义
实体完整性规定表的每一行在表中是唯一的实体。SQL语法中,表中的UNIQUE、PRIMARY KEY和IDENTITY约束就是实体完整性的体现。
实体完整性规则:每个关系中主码的任何属性不能取空值。
注意:空值为NULL,不是0,也不是空格,而是一个“不知道”或“不确定”的数据值。
2、实施完整性检查的时机
实施完整性规则检查的时机分为立即检查和延迟检查(Immediate or deferred Checking),
只有选择正确的检查时机才能保证语义的正确性,即保证数据的完整性。
实体完整性规则检查的时机是立即检查的,而参照完整性和触发器一般都是延迟检查。
3、事务处理
事务是一组数据库操作的集合,这些操作要么一起成功,要么一起失败。操作的提交或回退是一同生效的。事务处理的概念对维护数据的完整性和一致性是十分重要的。
数据库操作(如INSERT、UPDATE和DELETE)如果是一个事务中的操作,那么它们要在事务控制之下完成。数据库对象的begin Transaction、commit Transaction和rollback Transaction方法分别用来启动、提交和回退事务。
实验内容:
(1) 在数据库School中建立表Stu_Union,进行主键约束,在没有违反实体完整性的前提下插入并更新一条记录。
(2) 演示违反实体完整性的插入操作。
(3) 演示违反实体完整性的更新操作。
(4) sql语句实现的四种功能演示事务的处理,包括事务的建立、处理以及出错时的事务回滚。
(5) 通过建立Scholarship表,插入数据,演示当与现有的数据环境不等时,无法建立实体完整性以及参照完整性。
实验步骤:
代码实现参见数据库实验习题2.1.sql文档
心得体会:
1、 学习了实体完整性的相关内容,加深了对于这部分知识点的认识;
(实验课本第59——
思考:为什么sno置为‘’没有违反非空的约束?
答:SQL系统默认这里定义的‘’为一个值;如果执行sno=NULL,则将被系统拒绝)
实验2.2 参照完整性
实验目的:
学习建立外键,以及利用FOREIGN KEY---REFERENCES子句以及各种约束保证参照完整性。     
实验原理:
1) 参照完整性(Referential Integrity)
参照完整性是指两个表的主关键字和外关键字的数据对应一致。它确保了有主关键字的表中对应其他表的外关键字的行存在,即保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。参照完整性是建立在外关键字和主关键之间或外关键字和唯一性关键字之间的关系上的。
参照完整性规则:关系R的外来码取值必须是关系S中某个元组的主码值,或者可以是一个“空值”。
定义外键时定义参照完整性、约束参照表A和被参照表B。对于违反参照完整性的操作有时候并不是简单拒绝执行,而是接受该操作,同时执行必要的附加操作。DBMS提供机制来定义是否必须制定外键的具体值而非空值。主键列和外键列可以有不同的名字,空值的要求也可以不一致,默认值也可以不同,但数据类型必须相同。
2) SL Server中完整性的体现
在SQL Server中参照完整性作用表现在如下几个方面:
·禁止在从表中插入包括主要中不存在的外关键字的数据行。
·禁止会导致从表中的相应值孤立的主表中的外关键字值改变。
·禁止删除在从表中的有对应记录的主表记录。
3) SQL语句中删除和插入基本关系元组
(1) 在被参照关系中删除元组的三种控制方式:
    ·级联删除(CASCADES):将参照关系中与被参照关系中要删除的元组主键值相同的元组一起删除。
·受限删除(RESTRICTED):只有参照关系中没有元组与被参照关系中要删除的元组主键值相同时才执行删除操作,否则拒绝。
·置空值删除(SET NULL):删除被参照关系中的元组,同时将参照关系中相应元组的外键值置空。
(2) 在参照关系中插入元组。
·受限插入:只是被参照关系中有元组与参照关系中要插入元组外键值相同时,才执行插入操作,否则拒绝。
·递归插入:插入元组外键值在被参照关系中没有相同元组,则首先向被参照关系插入元组,其主键值等于参照关系插入元组的外键值,然后再向参照关系插入元组。
4) DBMS对参照完整性进行检查的四种情况
(1) 在四种情况下DBMS要进行检查,分别是对参照表进行插入和修改以及对被参照表进行删除和修改。
(2) SQL Server四种情况违反参照完整性的处理方法如表所示:
相关操作
INSERT
DELETE
UPDATE
被参照表
不需要检查
ON DELETE…(用户显示定义的方式,提供两种:cascade 和no action)OR default(系统默认的方式no action)
ON UPDATE…(用户显示方式,提供两种:cascade 和no action)OR default(系统默认的方式no action)
参照表
拒绝执行
不需要检查
拒绝执行
5) 参照完整性的特殊问题
(1) 表的自参考问题。
问题1:无法定义。
处理方法:先用create table创建主键约束,再用alter table创建外键约束。
问题2:容易造成无法启动的情况。(系统通过事务完毕后再检查)
(2) 两张表互相参照的问题。
问题1:无法定义。
处理方法:同表的自参照问题的解决方法相同。
问题2:容易造成无法启动的情况。(系统通过事务完毕后再检查)
(3) 既是外键又是主键中的属性。
处理方法:既要遵从实体完整性也要遵从参照完整性。
实验内容:
(1) 为演示参照完整性,建立表Course,令cno为主键,并在Stu_Union中插入数据。为下面的实验步骤做预先准备。
(2) 建立表SC,令sno和cno分别为参照Stu_Union表以及Course表的外键,设定为级联删除,并令(sno,cno)为其主键。在不违反参照完整性的前提下,插入数据。
(3) 演示违反参照完整性的插入数据。
(4) 在Stu_Union中删除数据,演示级联删除。
(5) 在Course中删除数据,演示级联删除。
(6) 为了演示多重级联删除,建立Stu_Union表,令stu_id为参照Stu_Union表的外键,令card_id为其主键,并插入数据。
(7) 为了演示多重级联删除,建立ICBC_Card表,令stu_card_id为参照Stu_Card表的外键,令bank_id为其主键,并插入数据。
(8) 通过删除students表中的一条记录,演示三个表的多重级联删除。
(9) 演示事务中进行多重级联删除失败的处理。修改ICBC_Card表的外键属性,使其变为On delete No action,演示事务中通过删除students表中的一条记录,多重级联删除失败,整个事务回滚到事务的初始状态。
(10) 演示互参照问题以及其解决方法。要建立教师授课和课程指定教师停课关系的两张表,规定一个教师可以授多门课,但是每个课程只能指定一个教师去听课,所以要为两张表建立相互之间的参照关系。
实验步骤:
代码实现参见数据库实验习题2.2.sql文档
心得体会:
1、学习了参照完整性的相关内容,加深了对于这部分知识点的认识;
(习题:
1)用alter table语句将SC表中的on delete cascade 改为on delete restrict。重新插入SC
的数据。重复本实验的实验步骤中(4)(5),观察结果,分析原因。
2)用alter table语句将SC表中的on delete cascade 改为on delete set NULL。重新插入SC的数据。重复本实验的实验步骤中(4)(5),观察结果,分析原因。
解答:SQL不提供on delete restrict/on delete set NULL,用on delete no action;结果:数据库不允许删除STU_UNION表以及NEW_COUSE表中对应的元组;原因:(1)由于on delete restrict的约束,数据库不允许任何引用关系存在对应元组的删除操作(2)约束on delete set NULL是将要删除的对应元组的外键置空值,如果snocno不是SC表的主键,删除操作是可以完成的,但是由于主键不可以取空值,所以删除操作不能进行。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。