您好,欢迎访问三七文档
第5章数据库完整性第5章数据库完整性什么是数据库的完整性数据的正确性和相容性,防止不合语义的数据进入数据库。例:学生的年龄必须是整数,取值范围为14--29;学生的性别只能是男或女;学生的学号一定是唯一的;学生所在的系必须是学校开设的系;完整性:否真实地反映现实世界第5章数据库完整性第5章数据库完整性为维护数据库的完整性,DBMS必须:1.提供定义完整性约束条件的机制2.提供完整性检查的方法3.违约处理第5章数据库完整性5.1实体完整性5.2参照完整性5.3用户自定义完整性5.4完整性约束命名子句5.5触发器5.6小结5.1实体完整性5.1.1实体完整性定义5.1.2实体完整性检查和违约处理5.1.1实体完整性的定义5.1.1实体完整性的定义5.1.1实体完整性的定义5.1.1实体完整性的定义(2)在表级定义主码CREATETABLES(SnoCHAR(9),SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),PRIMARYKEY(Sno));5.1.1实体完整性的定义5.1实体完整性5.1.1实体完整性定义5.1.2实体完整性检查和违约处理5.1.2实体完整性检查和违约处理5.1.2实体完整性检查和违约处理5.1.2实体完整性检查和违约处理5.2参照完整性5.2参照完整性5.2.1参照完整性定义5.2.2参照完整性检查和违约处理5.2.1参照完整性定义5.2.1参照完整性定义例如,关系SC中(Sno,Cno)是主码。Sno,Cno分别参照引用S表的主码和C表的主码[例3]定义SC中的参照完整性CREATETABLESC(SnoCHAR(9),CnoCHAR(4),GradeSMALLINT,PRIMARYKEY(Sno,Cno),/*在表级定义实体完整性*/FOREIGNKEY(Sno)REFERENCESS(Sno),/*在表级定义参照完整性*/FOREIGNKEY(Cno)REFERENCESC(Cno)/*在表级定义参照完整性*/);5.2参照完整性5.2.1参照完整性定义5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理3.在参照关系中,修改外码的问题S(Sno,Sname,Sage,…)SC(Sno,Cno,Grade)95001,张三,20,…95001,DB,9095002,李四,19,…95001,OS,8595002,DB,865.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理5.2.2参照完整性检查和违约处理显式说明参照完整性的违约处理示例CREATETABLESC(SnoCHAR(9),CnoCHAR(4),GradeSMALLINT,PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESS(Sno)ONDELETECASCADE/*当删除s表中的元组时级联删除SC表中相应的元组*/ONUPDATECASCADE,/*当更新s表中的元组时,级联更新SC表中相应的元组*/FOREIGNKEY(Cno)REFERENCESC(Cno)ONDELETENOACTION/*当删除c表中的元组造成了与SC表不一致时拒绝删除*/ONUPDATECASCADE/*当更新c表中的元组时,级联更新SC表中相应的元组*/);5.3用户自定义完整性5.3用户定义的完整性5.3.1属性上的约束条件的定义5.3.2属性上的约束条件检查和违约处理5.3.3元组上的约束条件的定义5.3.4元组上的约束条件检查和违约处理5.3.1属性上的约束条件的定义5.3.1属性上的约束条件的定义5.3.1属性上的约束条件的定义5.3用户自定义完整性5.3用户定义的完整性5.3.1属性上的约束条件的定义5.3.2属性上的约束条件检查和违约处理5.3.3元组上的约束条件的定义5.3.4元组上的约束条件检查和违约处理5.3.2属性上的约束条件检查和违约处理•插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足•如果不满足则操作被拒绝执行5.3用户定义的完整性5.3.1属性上的约束条件的定义5.3.2属性上的约束条件检查和违约处理5.3.3元组上的约束条件的定义5.3.4元组上的约束条件检查和违约处理5.3.3元组上的约束条件的定义5.3.3元组上的约束条件的定义5.3用户定义的完整性5.3.1属性上的约束条件的定义5.3.2属性上的约束条件检查和违约处理5.3.3元组上的约束条件的定义5.3.4元组上的约束条件检查和违约处理5.3.4元组上的约束条件检查和违约处理5.4完整性约束命名子句5.4完整性约束命名子句[例10]建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。CREATETABLEStudent(SnoINT(6)CONSTRAINTC1CHECK(SnoBETWEEN90000AND99999),SnameCHAR(20)CONSTRAINTC2NOTNULL,SageSMALLINT(3)CONSTRAINTC3CHECK(Sage30),SsexCHAR(2)CONSTRAINTC4CHECK(SsexIN('男','女')),CONSTRAINTStudentKeyPRIMARYKEY(Sno));在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束。5.4完整性约束命名子句5.4完整性约束命名子句[例13]修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40可以先删除原来的约束条件,再增加新的约束条件ALTERTABLEStudentDROPCONSTRAINTC1;ALTERTABLEStudentADDCONSTRAINTC1CHECK(SnoBETWEEN900000AND999999),ALTERTABLEStudentDROPCONSTRAINTC3;ALTERTABLEStudentADDCONSTRAINTC3CHECK(Sage40);5.5触发器5.5触发器5.5.1定义触发器5.5.2激活触发器5.5.3删除触发器5.5.1定义触发器5.5.1定义触发器5.5.1定义触发器5.5.1定义触发器(6)触发条件WHEN触发条件:指定触发器的触发条件。当满足触发条件时,DBMS才激发触发器。如果省略,则触发动作体在触发器激活后立即执行。(7)触发动作体–触发动作体可以是一个匿名PL/SQL过程块–也可以是对已创建存储过程的调用5.5.1定义触发器[例2]定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。CREATETRIGGERInsert_Or_Update_SalBEFOREINSERTORUPDATEONTeacher/*触发事件是插入或更新操作*/FOREACHROW/*行级触发器*/ASBEGIN/*定义触发动作体,是PL/SQL过程块*/IF(new.Job='教授')AND(new.Sal4000)THENnew.Sal:=4000;ENDIF;END;[例3]定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录首先建立工资变化表Sal_logCREATETABLESal_log(Tnochar(5)referencesTeacher(Tno),Salnumeric(7,2),Usernamechar(10),Datedatatime);[例3](续)CREATETRIGGERInsert_SalAFTERINSERTONTeacher/*触发事件是INSERT*/FOREACHROWASBEGININSERTINTOSal_logVALUES(new.Tno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);END;[例3](续)CREATETRIGGERUpdate_SalAFTERUPDATEONTeacher/*触发事件是UPDATE*/FOREACHROWASBEGINIF(new.Salold.Sal)THENINSERTINTOSal_logVALUES(new.Tno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);ENDIF;END;5.5触发器5.5.1定义触发器5.5.2激活触发器5.5.3删除触发器5.5..2激活触发器触发器的执行,是由触发事件激活的,并由数据库服务器自动执行一个数据表上可能定义了多个触发器同一个表上的多个触发器激活时遵循如下的执行顺序:(1)执行该表上的BEFORE触发器;(2)激活触发器的SQL语句;(3)执行该表上的AFTER触发器。[例4]执行修改某个教师工资的SQL语句,激活上述定义的触发器。UPDATETeacherSETSal=800WHEREEname='陈平';执行顺序是:执行触发器Insert_Or_Update_Sal执行SQL语句“UPDATETeacherSETSal=800WHEREEname='陈平';”执行触发器Insert_Sal;执行触发器Update_Sal5.5触发器5.5.1定义触发器5.5.2激活触发器5.5.3删除触发器5.5.3删除触发器删除触发器的SQL语法:DROPTRIGGER触发器名ON表名;触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。[例5]删除教师表Teacher上的触发器Insert_SalDROPTRIGGERInsert_SalONTeacher;5.6小结数据库的完整性是为了保证数据库中存储的数据是正确的RDBMS完整性实现的机制完整性约束定义机制完整性检查机制违背完整性约束条件时RDBMS应采取的动作
本文标题:第5章数据库完整性
链接地址:https://www.777doc.com/doc-2196279 .html