AnIntroductiontoDatabaseSystem1数据库系统概论AnIntroductiontoDatabaseSystem第五章数据库完整性AnIntroductiontoDatabaseSystem2第五章数据库完整性什么是数据库的完整性数据的正确性和相容性防止不合语义的数据进入数据库。例:学生的年龄必须是整数,取值范围为14--50;学生的性别只能是男或女;学生的学号一定是唯一的;学生所在的系必须是学校开设的系;完整性:能否真实地反映现实世界AnIntroductiontoDatabaseSystem3完整性控制机制1.提供定义完整性约束条件的机制2.提供完整性检查的方法3.违约处理AnIntroductiontoDatabaseSystem4完整性约束条件定义完整性约束条件:数据模型的组成部分,约束数据库中数据的语义DBMS应提供定义数据库完整性约束条件,并把它们作为模式的一部分存入数据库中AnIntroductiontoDatabaseSystem5完整性控制机制检查用户发出的操作请求是否违背了完整性约束条件AnIntroductiontoDatabaseSystem6违约反应如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。AnIntroductiontoDatabaseSystem7第五章数据库完整性5.1实体完整性5.2参照完整性5.3用户定义的完整性5.4完整性约束命名子句5.5域中的完整性限制5.6触发器5.7小结AnIntroductiontoDatabaseSystem85.1.1实体完整性定义关系模型的实体完整性在CREATETABLE中用PRIMARYKEY定义。单属性的码:定义为列级约束条件定义为表级约束条件多属性的码:定义为表级约束条件例1:将Student表中的Sno属性定义为码:CREATETABLEStudent(SnoCHAR(9)PRIMARYKEY,SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20));CREATETABLEStudent(SnoCHAR(9),SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20)PRIMARYKEY(Sno));AnIntroductiontoDatabaseSystem9实体完整性定义举例例2:将SC表中的Sno,Cno属性组定义为码CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,PRIMARYKEY(Sno,Cno));AnIntroductiontoDatabaseSystem105.1.2实体完整性检查和违约处理对定义主码的表,当用户要插入一条记录或对主码列进行更新操作时,要进行实体完整性规则自动检查。检查主码值是否唯一,若不唯一则拒绝插入或修改;检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。检查方法:全表扫描B+树索引AnIntroductiontoDatabaseSystem11B+树索引25351516879315307984936869717651546530411520253725AnIntroductiontoDatabaseSystem12第五章数据库完整性5.1实体完整性5.2参照完整性5.3用户定义的完整性5.4完整性约束命名子句5.5域中的完整性限制5.6触发器5.7小结AnIntroductiontoDatabaseSystem135.2.1参照完整性定义关系模型的参照完整性在CREATETABLE中用FOREIGNKEY短语定义哪些列为外码,用REFERENCES短语指明外码参照哪些表的主码。例3:CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno),FOREIGNKEY(Cno)REFERENCESCourse(Cno));AnIntroductiontoDatabaseSystem145.2.2参照完整性检查和违约处理表5.1可能破坏参照完整性的情况及违约处理被参照表(例Student)参照表(例SC)违约处理可能破坏参照完整性插入元组拒绝可能破坏参照完整性修改外码值拒绝删除元组可能破坏参照完整性拒绝/级联删除/设置为空值修改主码值可能破坏参照完整性拒绝/级联删除/设置为空值AnIntroductiontoDatabaseSystem15例:职工-部门数据库包含职工表EMP和部门表DEPT1DEPT关系的主码为部门号Deptno2EMP关系的主码为职工号Empno,外码为部门号Deptno称DEPT为被参照关系或目标关系,EMP为参照关系RDBMS实现参照完整性时需要考虑以下4方面:5.2.2参照完整性检查和违约处理AnIntroductiontoDatabaseSystem161.外码是否可以接受空值的问题外码是否能够取空值:依赖于应用环境的语义实现参照完整性:系统提供定义外码的机制定义外码列是否允许空值的机制AnIntroductiontoDatabaseSystem171.外码是否可以接受空值的问题例1:在职工-部门数据库中,EMP关系包含有外码Deptno某元组的这一列若为空值,表示这个职工尚未分配到任何具体的部门工作和应用环境的语义是相符AnIntroductiontoDatabaseSystem181.外码是否可以接受空值的问题例2:学生-选课数据库Student关系为被参照关系,其主码为Sno。SC为参照关系,外码为Sno。若SC的Sno为空值:表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录在Grade中,与学校的应用环境是不相符的,因此SC的Sno列不能取空值。AnIntroductiontoDatabaseSystem192.在被参照关系中删除元组时的问题出现违约操作的情形:删除被参照关系的某个元组(student)而参照关系有若干元组(SC)的外码值与被删除的被参照关系的主码值相同AnIntroductiontoDatabaseSystem202.在被参照关系中删除元组时的问题违约反应:可有三种策略级联删除(CASCADES)受限删除(RESTRICTED)置空值删除(NULLIFIES)这三种处理方法,哪一种是正确的,要依应用环境的语义来定AnIntroductiontoDatabaseSystem212.在被参照关系中删除元组时的问题级联删除将参照关系中外码值与被参照关系中要删除元组主码值相对应的元组一起删除受限删除当参照关系中没有任何元组的外码值与要删除的被参照关系的元组的主码值相对应时,系统才执行删除操作,否则拒绝此删除操作AnIntroductiontoDatabaseSystem222.在被参照关系中删除元组时的问题置空值删除删除被参照关系的元组,并将参照关系中与被参照关系中被删除元组主码值相等的外码值置为空值。AnIntroductiontoDatabaseSystem232.在被参照关系中删除元组时的问题例3:要删除Student关系中Sno=950001的元组,而SC关系中有4个元组的Sno都等于950001。级联删除:将SC关系中所有4个Sno=950001的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去受限删除:系统将拒绝执行此删除操作。AnIntroductiontoDatabaseSystem242.在被参照关系中删除元组时的问题置空值删除:将SC关系中所有Sno=950001的元组的Sno值置为空值。在学生选课数据库中,显然第一种方法和第二种方法都是对的。第三种方法不符合应用环境语义。AnIntroductiontoDatabaseSystem253.在参照关系中插入元组时的问题出现违约操作的情形需要在参照关系中插入元组,而被参照关系不存在相应的元组违约反应受限插入递归插入AnIntroductiontoDatabaseSystem263.在参照关系中插入元组时的问题受限插入仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。递归插入首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。AnIntroductiontoDatabaseSystem273.在参照关系中插入元组时的问题例4:向SC关系插入(99001,1,90)元组,而Student关系中尚没有Sno=99001的学生受限插入:系统将拒绝向SC关系插入(99001,1,90)元组递归插入:系统将首先向Student关系插入Sno=99001的元组,然后向SC关系插入(99001,1,90)元组。AnIntroductiontoDatabaseSystem284.修改主码的问题两种策略(1)不允许修改主码(2)允许修改主码AnIntroductiontoDatabaseSystem29允许修改主码策略违约操作要修改被参照关系中某些元组的主码值,而参照关系中有些元组的外码值正好等于被参照关系要修改的主码值要修改参照关系中某些元组的主码值,而被参照关系中没有任何元组的外码值等于被参照关系修改后的主码值AnIntroductiontoDatabaseSystem30允许修改主码策略违约反应(1)修改的关系是被参照关系:与删除类似级联修改受限修改置空值修改AnIntroductiontoDatabaseSystem31允许修改主码策略级联修改修改被参照关系中主码值同时,用相同的方法修改参照关系中相应的外码值。受限修改拒绝此修改操作。只当参照关系中没有任何元组的外码值等于被参照关系中某个元组的主码值时,这个元组的主码值才能被修改。置空值修改修改被参照关系中主码值,同时将参照关系中相应的外码值置为空值。AnIntroductiontoDatabaseSystem32允许修改主码策略例5:将Student关系中Sno=950001的元组中Sno值改为960123。而SC关系中有4个元组的Sno=950001级联修改:将SC关系中4个Sno=950001元组中的Sno值也改为960123。如果参照关系同时又是另一个关系的被参照关系,则这种修改操作会继续级联下去。AnIntroductiontoDatabaseSystem33允许修改主码策略受限修改:只有SC中没有任何元组的Sno=950001时,才能修改Student表中Sno=950001的元组的Sno值改为960123。置空值修改:将Student表中Sno=950001的元组的Sno值改为960123。而将SC表中所有Sno=950001的元组的Sno值置为空值。在学生选课数据库中只有第一种方法是正确的。AnIntroductiontoDatabaseSystem34允许修改主码策略违约反应(2)修改的关系是参照关系:与插入类似受限插入递归插入AnIntroductiontoDatabaseSystem35参照完整性的实现RDBMS在实现参照完整性时:需要向用户提供定义主码、外码的机制向用户提供按照自己的应用要求选择处理依赖关系中对应的元组的方法AnIntroductiontoDatabaseSystem365.3用户定义的完整性5.3.1属性上的约束条件定义5.3.2属性上的约束条件检查和违约处理5.3.3元组上的约束条件的定义5.3.4元组上的约束条件检查和违约处理AnIntroductiontoDataba