
新版第5章-20170330.ppt
52页1,数据库系统概论An Introduction to Database System第五章 数据库完整性,2,数据库完整性,数据的安全性保护数据库 防止恶意的破坏和非法的存取防范对象:非法用户和非法操作 技术和方法主要有:用户身份鉴别存取控制技术:自主存取控制和强制存取控制视图技术 审计技术数据加密存储和加密传输数据的完整性防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据防范对象:不合语义的、不正确的数据,3,数据库完整性(续),数据库的完整性数据的正确性是指数据是符合现实世界语义,反映了当前实际状况的数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的例如,学生的学号必须唯一性别只能是男或女本科学生年龄的取值范围为14~50的整数学生所选的课程必须是学校开设的课程,学生所在的院系必须是学校已成立的院系等,4,关系模型中有三类完整性约束1. 实体完整性2. 参照完整性3. 用户定义的完整性,4,数据库完整性(续),关系模型的完整性规则是对关系的某种约束条件,即关系的值在人们对关系进行操作时应遵循的一些约束条件,实际上是满足现实世界对数据和语义的约束条件。
5,规则 2.1 实体完整性规则 (Entity Integrity) 若属性 A 是基本关系R的主属性,则属性 A 不能取空值例如:选课(学号,课程号,成绩),则“学号”和“课程号”两个属性都不能取空值对于实体完整性规则说明如下:P45实体完整性规则是针对基本关系而言,一个基本表对应一个实体集实体是可区分的,即具有某种唯一性标识,如每个学生都是独立个体,是不一样的关系模型中以主码作为唯一性标识主码中属性即主属性不能取空值,否则即存在不可标识的实体,这与第2点相矛盾,1.实体完整性定义,6,2. 参照完整性,1. 关系间的引用2. 外码3. 参照完整性规则,7,1.关系间的引用,在关系模型中实体及实体间的联系都是用关系来描述的,因此可能存在着关系与关系间的引用例1 学生实体、专业实体 学生(学号,姓名,性别,专业号,年龄) 专业(专业号,专业名),主码,主码,学生关系引用了专业关系的主码“专业号”学生关系中的某个属性的取值需要参照专业关系的属性取值专业号称作学生关系的外码,,问题:能否将专业表合并到学生表?第6章解决,8,2.外码(Foreign Key),设F(专业号)是基本关系R《学生》的一个或一组属性,但不是关系R《学生》的码,如果F(专业号)与基本关系S《专业》的主码Ks(专业号)相对应,则称F(专业号)是基本关系R《学生》的外码基本关系R《学生》称为参照关系(Referencing Relation)基本关系S《专业》称为被参照关系(Referenced Relation)或目标关系(Target Relation),9,,学生,选修表,课程,选修关系引用了学生关系的主码“学号”和课程关系的主码“课程号”,他们的值都必须是确实存在的----学生的学号和课程的课程号。
即选修关系中某些属性的取值需要参照其它关系的属性取值---引用,学号和课程号属性是选修关系的外码,例2,10,例3 学生实体及其内部的领导联系(一对多) 学生(学号,姓名,性别,专业号,年龄,班长),“学号”是主码,“班长”属性与本身的主码“学号”属性相对应,因此“班长”是外码,它引用了本关系的“学号” “班长” 必须是确实存在的学生的学号,11,3.参照完整性规则,规则2.2 参照完整性规则 若属性(或属性组)F(专业号)是基本关系R(学生)的外码,它与基本关系S(专业)的主码Ks(专业号)相对应(基本关系R和S不一定是不同的关系),则对于R(学生)中每个元组在F(专业号)上的值必须为: 或者取空值(F(专业号)的每个属性值均为空值) 或者等于S(专业)中某个元组的主码值,学生(学号,姓名,性别,专业号,年龄)专业(专业号,专业名),12,参照完整性规则(续),例:学生关系中每个元组的“专业号”属性只取两类值:(1)空值,表示尚未给该学生分配专业(2)专业关系中某个元组的“专业号”值,表示该学生不可能分配一个不存在的专业(3)考虑[例2.2] 中“学号”和“课程号”可能的取值 :因二者是选修关系中的主属性,按照实体完整性规则,他们不能取空值只能取相应被参照关系中已经存在的主码值,学生(学号,姓名,性别,专业号,年龄)专业(专业号,专业名)选修(学号,课程号,成绩),13,4.用户定义的完整性,例: 课程(课程号,课程名,学分)“课程号”属性必须取唯一值非主属性“课程名”也不能取空值“学分”属性只能取值{1,2,3,4},任何关系数据库系统都应该支持实体完整性和参照完整性,除此之外根据应用环境不同,往往还需要作一些特殊约束。
14,数据库完整性(续),为维护数据库的完整性,DBMS必须:1.提供定义完整性约束条件的机制:用DDL语句实现实体完整性、参照完整性和用户定义完整性2.提供完整性检查的方法:在INSERT、UPDATE和DELETE操作执行后,检查数据是否违背了完整性约束条件3.违约处理:拒绝(NOACTION)执行,或级联(CASCADE)执行其它操作以保证数据的完整性,15,,第五章 数据库完整性,5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句*5.5 域中的完整性限制5.6 断言5.7 触发器5.8 小结,16,,5.1 实体完整性,5.1.1 实体完整性定义5.1.2 实体完整性检查和违约处理,17,,5.1.1 实体完整性定义,关系模型的实体完整性CREATE TABLE中用PRIMARY KEY定义单属性构成的码有两种说明方法 定义为列级约束条件定义为表级约束条件对多个属性构成的码只有一种说明方法定义为表级约束条件,18,,实体完整性定义(续),[例5.1] 将Student表中的Sno属性定义为码 (1)在列级定义主码 CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) NOT NULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );,19,,实体完整性定义(续),(2)在表级定义主码 CREATE TABLE Student ( Sno CHAR(9), Sname CHAR(20) NOT NULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY (Sno) );,20,,实体完整性定义(续),[例5.2] 将SC表中的Sno,Cno属性组定义为码 CREATE TABLE SC ( Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY (Sno,Cno) /*只能在表级定义主码*/ );,21,,5.1 实体完整性,5.1.1 实体完整性定义5.1.2 实体完整性检查和违约处理,22,,5.1.2 实体完整性检查和违约处理,插入或对主码列进行更新操作时,关系数据库管理系统按照实体完整性规则自动进行检查。
包括:检查主码值是否唯一,如果不唯一则拒绝插入或修改检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改,23,,实体完整性检查和违约处理(续),检查记录中主码值是否唯一的一种方法是进行全表扫描依次判断表中每一条记录的主码值与将插入记录上的主码值(或者修改的新主码值)是否相同,24,,实体完整性检查和违约处理(续),表扫描缺点十分耗时为避免对基本表进行全表扫描,RDBMS核心一般都在主码上自动建立一个索引,,1、检查新插入记录的主码属性是否为空,为空就拒绝插入或修改2、如果新插入记录上的主码值(或者修改的新主码值)与表中某个记录上的主码值相同,则拒绝插入或修改25,,实体完整性检查和违约处理(续),B+树索引例如,新插入记录的主码值是25通过主码索引,从B+树的根结点开始查找读取3个结点:根结点(3 54 71),中间结点(3 15 30),叶结点(15 20 25)该主码值已经存在,不能插入这条记录,P160,错误!,26,B+树定义基本与B-树同,除了:1.非叶子结点的子树指针与关键字个数相同;2.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);3.为所有叶子结点增加一个链指针;4.所有关键字都在叶子结点出现;,27,,第五章 数据库完整性,5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句*5.5 域中的完整性限制5.6 断言5.7 触发器5.8 小结,28,,5.2 参照完整性,5.2.1 参照完整性定义5.2.2 参照完整性检查和违约处理,29,,5.2.1 参照完整性定义,关系模型的参照完整性定义在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码用REFERENCES短语指明这些外码参照哪些表的主码,30,,参照完整性定义(续),例如,关系SC中(Sno,Cno)是主码。
Sno,Cno分别参照Student表的主码和Course表的主码 [例5.3]定义SC中的参照完整性 CREATE TABLE SC ( Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY (Sno, Cno), /*在表级定义实体完整性*/ FOREIGN KEY (Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/ FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/ );,31,,5.2 参照完整性,5.2.1 参照完整性定义5.2.2 参照完整性检查和违约处理,32,参照完整性检查和违约处理,一个参照完整性将两个表中的相应元组联系起来对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查,33,参照完整性检查和违约处理(续),例如,对表SC和Student有四种可能破坏参照完整性的情况 :SC表中增加一个元组,该元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。
修改SC表中的一个元组,修改后该元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。












