第五章数据库完整性

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第五章数据库完整性5.1实体完整性.................................................................................................................................15.1.1实体完整性定义.............................................................................................................15.1.2实体完整性检查和违约处理.........................................................................................25.2参照完整性................................................................................................................................35.2.1参照完整性定义...........................................................................................................35.2.2参照完整性检查和违约处理..........................................................................................45.3用户定义的完整性.....................................................................................................................65.3.1属性上的约束条件的定义.............................................................................................65.3.2属性上的约束条件检查和违约处理...........................................................................85.3.3元组上的约束条件的定义..............................................................................................85.3.3元组上的约束条件检查和违约处理..............................................................................85.4完整性约束命名子句.................................................................................................................8*5.5域中的完整性限制.................................................................................................................105.6触发器...................................................................................................................................105.6.1定义触发器...............................................................................................................115.6.2激活触发器..................................................................................................................135.6.3删除触发器....................................................................................................................14数据库的完整性是指数据的正确性和兼容性。数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。数据的安全性是保护数据库防止恶意的破坏和非法的存取。为维护数据库的完整性,DBMS必须能够;1.提供定义完整性约束条件的机制2.提供完整性检查的方法3.违约处理我们在第2章2.3已经讲解了关系数据库三类完整性约束约束的基本概念,下面讲解SQL语言中实现这些完整性控制功能的方法。5.1实体完整性5.1.1实体完整性定义1.将STUDENT表中的SNO属性定义为码。CREATETABLEStudent(SnoCHAR(9)PRIMARYKEY,/*在列级定义主码*/SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20));或者CREATETABLEStudent(SnoCHAR(9),SnameCHAR(20)NOTNULL,SsexCHAR(20),SageSMALLINT,SdeptCHAR(20),PRIMARYKEY(Sno)/*在表级定义主码*/);2.将SC表中的Sno,Cno属性组定义为码CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,PRIMARYKEY(Sno,Cno)/*只能在表级定义主码*/);5.1.2实体完整性检查和违约处理包括:1.检查主码值是否唯一,如果不唯一则拒绝插入或修改。2.检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。从而保证了实体完整性。全表扫描是十分耗时的。为了避免对基本表进行全表扫描,RDBMS核心一般都在主码上自动建立一个索引,如图5.2的B+树索引。通过索引查找基本表中是否已经存在新的主码值,将大大提高效率。图5.2使用索引检查主码唯一性5.2参照完整性5.2.1参照完整性定义例如,关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno,Cno分别参照引用Student表的主码和Course表的主码。3.定义SC中的参照完整性CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,PRIMARYKEY(Sno,Cno),/*在表级定义实体完整性*/FOREIGNKEY(Sno)REFERENCESStudent(Sno),/*在表级定义参照完整性*/25516678123037152025304151546568697176798493新记录的主码值FOREIGNKEY(Cno)REFERENCESCourse(Cno)/*在表级定义参照完整性*/);5.2.2参照完整性检查和违约处理一个参照完整性将两个表中的相应元组联系起来了。因此,对被参照表和参照表进行增删操作时有可能破坏参照完整性,必须进行检查。例如,对表SC和Student有四种可能破坏参照完整性的情况,如表5.1所示。1.SC表中增加一个元组,该元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。2.修改SC表中的一个元组,修改后该元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。3.从Student表中删除一个元组,造成SC表中某些元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。4.修改Student表中的一个元组的Sno属性,造成SC表中某些元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。表5.1可能破坏参照完整性的情况及违约处理当上述的不一致发生时,系统就可以采用以下的策略加以处理。1.拒绝(NOACTION)执行2.级连(CASCADE)操作3.设置为空值(SET-NULL)被参照表(例如Student)参照表(例如SC)违约处理可能破坏参照完整性插入元组拒绝可能破坏参照完整性修改外码值拒绝删除元组可能破坏参照完整性拒绝/级连删除/设置为空值修改主码值可能破坏参照完整性拒绝/级连修改/设置为空值当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。例如,有下面2个关系学生(学号,姓名,性别,专业号,年龄)专业(专业号,专业名)学生关系的“专业号”是外码,因为专业号是专业关系的主码。假设专业表中某个元组被删除,专业号为12,按照设置为了空值策略,就要把学生表中专业号=12的所有元组的专业号设置为空值。这对应了这样的语义:某个专业删除了,该专业的所有学生专业未定,等待重新分配专业。因此对于参照完整性时,除了应该定义外码,还应定义外码列是否允许空值。4.显示说明参照完整性的违约处理事例。CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,PRIMARYKEY(Sno,Cno),/*在表级定义实体完整性*/FOREIGNKEY(Sno)REFERENCESStudent(Sno)/*在表级定义参照完整性*/ONDELETECASCADE/*当删除Student表中的元组时,级连删除SC表中相应的元组*/ONUPDATECASCADE,/*当更新Student表中的Sno时,级连更新SC表中相应的元组*/FOREIGNKEY(Cno)REFERENCESCourse(Cno)/*在表级定义参照完整性*/ONDELETENOACTION/*当删除course表中的元组造成了与SC表不一致时拒绝删除*/ONUPDATECASCADE/*当更新course表中的cno时,级连更新SC表中相应的元组*/);从上面的讨论看到RSBMS在实现参照完整性时,除了要提供定义主码、外码的机制外,还需要提供不同的策略供用户选择。选择哪种策略,要根据应用环境的要求确定。5.3用户定义的完整性用户定义的完整性就是针对某个具体应用的数据必须满足的语义要求。目前的RDBMS都提供了定义和检验这类完整性的机制,使用了和实体完整性、参照完整性相同的技术和方法来处理他们,而不必由应用程序来承担这一功能。5.3.1属性上的约束条件的定义在CREATETABLE中定义属性的同时可以根据应用要求,定义属性上的约束条件,即属性值限制,包括:列值非空(NOTNULL短语)列值唯一(UNIQUE短语)检查列值是否满足一个布尔表达式(CHECK短语)1.不允许取空值在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。CREATETABLESC(SnoCHAR(9)NOTNULL,/*Sno属性不允许取空值*/CnoCHAR(4)NOTNULL,/*Cno属性不允许取空值*/GradeSMALLINTNOTNULL,/*Grade属性不允许取空值*/PRIMARYKEY(Sno,Cno),/*如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值则在列级不允许取空值的定义就不

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功