数据库系统课件.ppt
中国人民大学信息学院计算机系中国人民大学信息学院计算机系数据库系统概论数据库系统概论An Introduction to Database System第十章第十章 数据库完整性数据库完整性AnIntroductiontoDatabaseSystem第十章第十章 数据库完整性数据库完整性什么是数据库的完整性n数据的正确性和相容性n防止不合语义的数据进入数据库。例:学生的年龄必须是整数,取值范围为14-29;学生的性别只能是男或女;学生的学号一定是唯一的;学生所在的系必须是学校开设的系;n完整性:否真实地反映现实世界AnIntroductiontoDatabaseSystem完整性控制机制完整性控制机制1.完整性约束条件定义机制2.完整性检查机制3.违约反应AnIntroductiontoDatabaseSystem完整性约束条件定义完整性约束条件定义n完整性约束条件:数据模型的组成部分约束数据库中数据的语义nDBMS应提供定义数据库完整性约束条件,并把它们作为模式的一部分存入数据库中AnIntroductiontoDatabaseSystem完整性控制机制完整性控制机制n检查用户发出的操作请求是否违背了完整性约束条件AnIntroductiontoDatabaseSystem违约反应违约反应n如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。AnIntroductiontoDatabaseSystem第十章第十章 数据库完整性数据库完整性10.1完整性约束条件10.2完整性控制10.3Oracle的完整性10.4小结AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)完整性约束条件作用的对象n列:对属性的取值类型、范围、精度等的约束条件n元组:对元组中各个属性列间的联系的约束n关系:对若干元组间、关系集合上以及关系之间的联系的约束AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)n静态n对静态对象的约束是反映数据库状态合理性的约束n动态n对动态对象的约束是反映数据库状态变迁的约束AnIntroductiontoDatabaseSystem完整性约束条件分类完整性约束条件分类六类完整性约束条件n静态列级约束n静态元组约束n静态关系约束n动态列级约束n动态元组约束n动态关系约束AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)对象状态动态列级约束动态元组约束动态关系约束动态静态列级约束静态元组约束静态关系约束静态列元组关系对象粒度AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)1.静态列级约束n静态列级约束:对的取值域的说明n最常见、最简单、最容易实现的一类完整性约束AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)n五类静态列级约束1)数据类型约束:数据的类型、长度、单位、精度等例:学生姓名的数据类型为字符型,长度为82)对数据格式的约束例:学号:前两位表示入学年份,后四位为顺序编号日期:YY.MM.DD。AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)3)取值范围或取值集合的约束例:规定成绩的取值范围为0-100年龄的取值范围为14-29性别的取值集合为男,女4)对空值的约束空值:未定义或未知的值空值:与零值和空格不同有的列允许空值,有的则不允许,如成绩可为空值5)其他约束例:关于列的排序说明,组合列等AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)2.静态元组约束规定元组的各个列之间的约束关系例:订货关系中发货量=700元静态元组约束只局限在元组上AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)3.静态关系约束关系的各个元组之间或若干关系之间存在的各种联系或约束常见静态关系约束:1)实体完整性约束2)参照完整性约束3)函数依赖约束4)统计约束AnIntroductiontoDatabaseSystem函数依赖约束函数依赖约束n关系字段间存在的函数依赖例:在学生课程教师关系SJT(S,J,T)的函数依赖:(S,J)T,TJ)主码:(S,J)AnIntroductiontoDatabaseSystem统计约束统计约束n定义某个字段值一个关系多个元组的统计值之间的约束关系n例:职工平均工资的2倍=部门经理的工资=原来工资年龄只能增长AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)5.动态元组约束修改元组值:各个字段之间要满足的约束条件例:职工工资调整不得低于其原来工资+工龄*1.5AnIntroductiontoDatabaseSystem完整性约束条件(续)完整性约束条件(续)6.动态关系约束关系变化前后状态:限制条件例:事务一致性、原子性等约束条件AnIntroductiontoDatabaseSystem完整性约束条件小结完整性约束条件小结粒度状态列级元组级关系级静态列定义类型格式值域空值元组值应满足的条件实体完整性约束参照完整性约束函数依赖约束统计约束动态改变列定义或列值元组新旧值之间应满足的约束条件关系新旧状态间应满足的约束条件AnIntroductiontoDatabaseSystem第十章第十章 数据库完整性数据库完整性10.1完整性约束条件10.2完整性控制10.3Oracle的完整性10.4小结AnIntroductiontoDatabaseSystem10.2 完整性控制完整性控制一、DBMS的完整性控制机制二、关系系统三类完整性的实现三、参照完整性的实现AnIntroductiontoDatabaseSystem一、一、DBMS的完整性控制机制的完整性控制机制1.定义功能一个完善的完整性控制机制应该允许用户定义各类完整性约束条件。AnIntroductiontoDatabaseSystemDBMS的完整性控制机制(续)的完整性控制机制(续)2.检查功能n立即执行的约束(Immediateconstraints)语句执行完后立即检查是否违背完整性约束n延迟执行的约束(Deferredconstrainsts)完整性检查延迟到整个事务执行结束后进行AnIntroductiontoDatabaseSystemDBMS的完整性控制机制(续)的完整性控制机制(续)例:银行数据库中“借贷总金额应平衡”的约束就应该是延迟执行的约束n从账号A转一笔钱到账号B为一个事务,从账号A转出去钱后账就不平了,必须等转入账号B后账才能重新平衡,这时才能进行完整性检查。AnIntroductiontoDatabaseSystemDBMS的完整性控制机制(续)的完整性控制机制(续)3.违约反应n拒绝该操作n其他处理方法AnIntroductiontoDatabaseSystemDBMS的完整性控制机制(续)的完整性控制机制(续)完整性规则五元组表示:(D,O,A,C,P)nD(Data)约束作用的数据对象;nO(Operation)触发完整性检查的数据库操作当用户发出什么操作请求时需要检查该完整性规则是立即检查还是延迟检查;nA(Assertion)数据对象必须满足的断言或语义约束这是规则的主体;nC(Condition)选择A作用的数据对象值的谓词;nP(Procedure)违反完整性规则时触发的过程。AnIntroductiontoDatabaseSystemDBMS的完整性控制机制(续)的完整性控制机制(续)例1:在“学号不能为空”的约束中D约束作用的对象为Sno属性O插入或修改Student元组时ASno不能为空C无(A可作用于所有记录的Sno属性)P拒绝执行该操作AnIntroductiontoDatabaseSystemDBMS的完整性控制机制(续)的完整性控制机制(续)例2:在“教授工资不得低于1000元”的约束中D约束作用的对象为工资Sal属性O插入或修改职工元组时ASal不能小于1000C职称=教授(A仅作用于职称=教授的记录)P拒绝执行该操作AnIntroductiontoDatabaseSystem二、关系系统三类完整性的实现二、关系系统三类完整性的实现n关系数据库系统都提供了定义和检查实体完整性、参照完整性和用户定义的完整性的功能n违反实体完整性规则和用户定义的完整性规则的操作:一般是拒绝执行n违反参照完整性的操作:n拒绝执行n接受这个操作,同时执行一些附加的操作,以保证数据库的状态正确AnIntroductiontoDatabaseSystem三、参照完整性的实现三、参照完整性的实现例:职工部门数据库包含职工表EMP和部门表DEPT1DEPT关系的主码为部门号Deptno2EMP关系的主码为职工号Empno,外码为部门号Deptno称DEPT为被参照关系或目标关系,EMP为参照关系RDBMS实现参照完整性时需要考虑以下4方面:AnIntroductiontoDatabaseSystem 1.外码是否可以接受空值的问题外码是否可以接受空值的问题n外码是否能够取空值:依赖于应用环境的语义n实现参照完整性:系统提供定义外码的机制定义外码列是否允许空值的机制AnIntroductiontoDatabaseSystem1.外码是否可以接受空值的问题外码是否可以接受空值的问题例1:在职工部门数据库中,EMP关系包含有外码Deptno某元组的这一列若为空值,表示这个职工尚未分配到任何具体的部门工作和应用环境的语义是相符AnIntroductiontoDatabaseSystem1.外码是否可以接受空值的问题外码是否可以接受空值的问题例2:学生选课数据库Student关系为被参照关系,其主码为Sno。SC为参照关系,外码为Sno。若SC的Sno为空值:表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录在Grade中与学校的应用环境是不相符的,因此SC的Sno列不能取空值。AnIntroductiontoDatabaseSystem2.在被参照关系中删除元组时的问题在被参照关系中删除元组时的问题出现违约操作的情形:删除被参照关系的某个元组(student)而参照关系有若干元组(SC)的外码值与被删除的被参照关系的主码值相同AnIntroductiontoDatabaseSystem2.在被参照关系中删除元组时的问题在被参照关系中删除元组时的问题n违约反应:可有三种策略n级联删除(CASCADES)n受限删除(RESTRICTED)n置空值删除(NULLIFIES)这三种处理方法,哪一种是正确的,要依应用环境的语义来定AnIntroductiontoDatabaseSystem2.在被参照关系中删除元组时的问题在被参照关系中删除元组时的问题n级联删除将参照关系中外码值与被参照关系中要删除元组主码值相对应的元组一起删除n受限删除当参照关系中没有任何元组的外码值与要删除的被参照关系的元组的主码值相对应时,系统才执行删除操作,否则拒绝此删除操作AnIntroductiontoDatabaseSystem2.在被参照关系中删除元组时的问题在被参照关系中删除元组时的问题n置空值删除删除被参照关系的元组,并将参照关系中与被参照关系中被删除元组主码值相等的外码值置为空值。AnIntroductiontoDatabaseSystem2.在被参照关系中删除元组时的问题在被参照关系中删除元组时的问题例:要删除Student关系中Sno=950001的元组,而SC关系中有4个元组的Sno都等于950001。n级联删除:将SC关系中所有4个Sno=950001的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去n受限删除:系统将拒绝执行此删除操作。AnIntroductiontoDatabaseSystem2.在被参照关系中删除元组时的问题在被参照关系中删除元组时的问题n置空值删除:将SC关系中所有Sno=950001的元组的Sno值置为空值。n在学生选课数据库中,显然第一种方法和第二种方法都是对的。第三种方法不符合应用环境语义。AnIntroductiontoDatabaseSystem3.在参照关系中插入元组时的问题在参照关系中插入元组时的问题n出现违约操作的情形n需要在参照关系中插入元组,而被参照关系不存在相应的元组n违约反应n受限插入n递归插入AnIntroductiontoDatabaseSystem3.在参照关系中插入元组时的问题在参照关系中插入元组时的问题n受限插入n仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。n递归插入n首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。AnIntroductiontoDatabaseSystem3.在参照关系中插入元组时的问题在参照关系中插入元组时的问题例:向SC关系插入(99001,1,90)元组,而Student关系中尚没有Sno=99001的学生n受限插入:系统将拒绝向SC关系插入(99001,1,90)元组n递归插入:系统将首先向Student关系插入Sno=99001的元组,然后向SC关系插入(99001,1,90)元组。AnIntroductiontoDatabaseSystem4.修改被参照关系中主码的问题修改被参照关系中主码的问题n两种策略(1)不允许修改主码(2)允许修改主码AnIntroductiontoDatabaseSystem允许修改主码策略允许修改主码策略n违约操作要修改被参照关系中某些元组的主码值,而参照关系中有些元组的外码值正好等于被参照关系要修改的主码值要修改参照关系中某些元组的主码值,而被参照关系中没有任何元组的外码值等于被参照关系修改后的主码值AnIntroductiontoDatabaseSystem允许修改主码策略允许修改主码策略n违约反应(1)n修改的关系是被参照关系:与删除类似n级联修改n受限修改n置空值修改AnIntroductiontoDatabaseSystem允许修改主码策略允许修改主码策略n级联修改n修改被参照关系中主码值同时,用相同的方法修改参照关系中相应的外码值。n受限修改n拒绝此修改操作。只当参照关系中没有任何元组的外码值等于被参照关系中某个元组的主码值时,这个元组的主码值才能被修改。n置空值修改n修改被参照关系中主码值,同时将参照关系中相应的外码值置为空值。AnIntroductiontoDatabaseSystem允许修改主码策略允许修改主码策略例:将Student关系中Sno=950001的元组中Sno值改为960123。而SC关系中有4个元组的Sno=950001n级联修改:将SC关系中4个Sno=950001元组中的Sno值也改为960123。如果参照关系同时又是另一个关系的被参照关系,则这种修改操作会继续级联下去。AnIntroductiontoDatabaseSystem允许修改主码策略允许修改主码策略n受限修改:只有SC中没有任何元组的Sno=950001时,才能修改Student表中Sno=950001的元组的Sno值改为960123。n置空值修改:将Student表中Sno=950001的元组的Sno值改为960123。而将S表中所有Sno=950001的元组的Sno值置为空值。n在学生选课数据库中只有第一种方法是正确的。AnIntroductiontoDatabaseSystem允许修改主码策略允许修改主码策略n违约反应(2)n修改的关系是参照关系:与插入类似n受限插入n递归插入AnIntroductiontoDatabaseSystem参照完整性的实现参照完整性的实现RDBMS在实现参照完整性时:n需要向用户提供定义主码、外码的机制n向用户提供按照自己的应用要求选择处理依赖关系中对应的元组的方法AnIntroductiontoDatabaseSystem第十章第十章 数据库完整性数据库完整性10.1完整性约束条件10.2完整性控制10.3Oracle的完整性10.4小结AnIntroductiontoDatabaseSystem10.3 Oracle的完整性的完整性一、Oracle中的实体完整性二、Oracle中的参照完整性三、Oracle中用户定义的完整性AnIntroductiontoDatabaseSystem一、一、ORACLE中的实体完整性中的实体完整性nORACLE在CREATETABLE语句中提供了PRIMARYKEY子句,供用户在建表时指定关系的主码列。n在列级使用PRIMARYKEY子句n在表级使用PRIMARYKEY子句AnIntroductiontoDatabaseSystemORACLE中的实体完整性(续)中的实体完整性(续)例1:在学生选课数据库中,要定义Student表的Sno属性为主码CREATETABLEStudent(SnoNUMBER(8),SnameVARCHAR(20),SageNUMBER(20),CONSTRAINTPK_SNOPRIMARYKEY(Sno);或:CREATETABLEStudent(SnoNUMBER(8)PRIMARYKEY,SnameVARCHAR(20),SageNUMBER(20);AnIntroductiontoDatabaseSystemORACLE中的实体完整性(续)中的实体完整性(续)例2:要在SC表中定义(Sno,Cno)为主码CREATETABLESC(SnoNUMBER(8),CnoNUMBER(2),GradeNUMBER(2),CONSTRAINTPK_SCPRIMARYKEY(Sno,Cno);AnIntroductiontoDatabaseSystemORACLE中的实体完整性(续)中的实体完整性(续)n用户程序对主码列进行更新操作时,系统自动进行完整性检查n违约操作n使主属性值为空值的操作n使主码值在表中不唯一的操作n违约反应n系统拒绝此操作,从而保证了实体完整性AnIntroductiontoDatabaseSystem二、二、ORACLE中的参照完整性中的参照完整性定义参照完整性nFOREIGNKEY子句:定义外码列nREFERENCES子句:外码相应于哪个表的主码nONDELETECASCADE子语:在删除被参照关系的元组时,同时删除参照关系中外码值等于被参照关系的元组中主码值的元组AnIntroductiontoDatabaseSystemORACLE中的参照完整性(续)中的参照完整性(续)例1:建立表EMP表CREATETABLEEMP(EmpnoNUMBER(4),EnameVARCHAR(10),JobVERCHAR2(9),MgrNUMBER(4),SalNUMBER(7,2),DeptnoNUMBER(2),CONSTRAINTFK_DEPTNOFOREIGNKEY(Deptno)REFERENCESDEPT(Deptno);AnIntroductiontoDatabaseSystemORACLE中的参照完整性(续)中的参照完整性(续)或:CREATETABLEEMP(EmpnoNUMBER(4),EnameVARCHAR(10),JobVERCHAR2(9),MgrNUMBER(4),SalNUMBER(7,2),DeptnoNUMBER(2)CONSTRAINTFK_DEPTNOFOREIGNKEYREFERENCESDEPT(Deptno);AnIntroductiontoDatabaseSystemORACLE中的参照完整性(续)中的参照完整性(续)n这时EMP表中外码为Deptno,它相应于DEPT表中的主码Deptno。n当要修改DEPT表中的DEPTNO值时,先要检查EMP表中有无元组的Deptno值与之对应n若没有,系统接受这个修改操作n否则,系统拒绝此操作AnIntroductiontoDatabaseSystemORACLE中的参照完整性(续)中的参照完整性(续)n当要删除DEPT表中某个元组时,系统要检查EMP表,若找到相应元组即将其随之删除。n当要插入EMP表中某个元组时,系统要检查DEPT表,先要检查DEPT表中有无元组的Deptno值与之对应n若没有,系统拒绝此插入操作n否则,系统接受此操作AnIntroductiontoDatabaseSystem三、三、ORACLE中用户定义的完整性中用户定义的完整性nORACLE中定义用户完整性的两类方法n用CREATETABLE语句在建表时定义用户完整性约束n通过触发器来定义用户的完整性规则AnIntroductiontoDatabaseSystemORACLE中用户定义的完整性(续)中用户定义的完整性(续)1.用CREATETABLE语句在建表时定义用户完整性约束可定义三类完整性约束n列值非空(NOTNULL短语)n列值唯一(UNIQUE短语)n检查列值是否满足一个布尔表达式(CHECK短语)AnIntroductiontoDatabaseSystemORACLE中用户定义的完整性(续)中用户定义的完整性(续)例1:建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码CREATETABLEDEPT(DeptnoNUMBER,DnameVARCHAR(9)CONSTRAINTU1UNIQUE,LocVARCHAR(10),CONSTRAINTPK_DEPTPRIMARYKEY(Deptno);其中CONSTRAINTU1UNIQUE表示约束名为U1,该约束要求Dname列值唯一。AnIntroductiontoDatabaseSystemORACLE中用户定义的完整性(续)中用户定义的完整性(续)例2:建立学生登记表Student,要求学号在900000至999999之间,年龄29,性别只能是男或女,姓名非空CREATETABLEStudent(SnoNUMBER(5)CONSTRAINTC1CHECK(SnoBETWEEN10000AND99999),SnameVARCHAR(20)CONSTRAINTC2NOTNULL,SageNUMBER(3)CONSTRAINTC3CHECK(Sage29),SsexVARCHAR(2)CONSTRAINTC4CHECK(SsexIN(男,女);AnIntroductiontoDatabaseSystemORACLE中用户定义的完整性(续)中用户定义的完整性(续)例3:建立职工表EMP,要求每个职工的应发工资不得超过3000元。应发工资实际上就是实发工资列Sal与扣除项Deduct之和。CREATETABLEEMP(EnoNUMBER(4)EnameVARCHAR(10),JobVARCHAR(8),SalNUMBER(7,2),DeductNUMBER(7,2)DeptnoNUMBER(2),CONSTRAINTSC1CHECK(Sal+Deduct=3000);AnIntroductiontoDatabaseSystemORACLE中用户定义的完整性(续)中用户定义的完整性(续)2.通过触发器来定义用户的完整性规则n定义其它的完整性约束时,需要用数据库触发器(Trigger)来实现。n数据库触发器:一类靠事务驱动的特殊过程n一旦由某个用户定义,任何用户对该数据的增、删、改操作均由服务器自动激活相应的触发子,在核心层进行集中的完整性控制n定义数据库触发器的语句CREATEORREPLACETRIGGERAnIntroductiontoDatabaseSystemORACLE中用户定义的完整性(续)中用户定义的完整性(续)例4:为教师表Teacher定义完整性规则“教授的工资不得低于800元,如果低于800元,自动改为800元”AnIntroductiontoDatabaseSystemORACLE中用户定义的完整性(续)中用户定义的完整性(续)CREATETRIGGERUPDATE_SALBEFOREINSERTORUPDATEOFSal,PosONTeacherFOREACHROWWHEN(:new.Pos=教授)BEGINIF:new.sal800THEN:new.Sal:=800;ENDIF;END;AnIntroductiontoDatabaseSystemOracle完整性小结完整性小结nORACLE提供定义完整性约束条件CREATETABLE语句CREATETRIGGER语句可以定义很复杂的完整性约束条件nORACLE自动执行相应的完整性检查对于违反完整性约束条件的操作:拒绝执行或者执行事先定义的操作AnIntroductiontoDatabaseSystem第十章第十章 数据库完整性数据库完整性10.1完整性约束条件10.2完整性控制10.3Oracle的完整性10.4小结AnIntroductiontoDatabaseSystem10.4 小结小结n数据库的完整性是为了保证数据库中存储的数据是正确的,所谓正确的是指符合现实世界语义的。nDBMS完整性实现的机制n完整性约束定义机制n完整性检查机制n违背完整性约束条件时DBMS应采取的动作AnIntroductiontoDatabaseSystem小结小结n完整性机制的实施会极大地影响系统性能n不同的数据库产品对完整性的支持策略和支持程度是不同的n许多数据库管理系统对完整性机制的支持比对安全性的支持要晚得多也弱得多n数据库厂商对完整性的支持越来越好,不仅在能保证实体完整性和参照完整性而且能在DBMS核心定义、检查和保证用户定义的完整性约束条件AnIntroductiontoDatabaseSystem下课了。下课了。休息一会儿。休息一会儿。AnIntroductiontoDatabaseSystem