您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 4第四章 数据库完整性
第四章数据库完整性数据库完整性数据库的完整性数据的正确性和相容性。防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。数据库完整性(续)为维护数据库的完整性,DBMS必须具有:1.提供定义完整性约束条件的机制2.提供完整性检查的方法3.违约处理第五章数据库完整性4.1实体完整性4.2参照完整性4.3用户定义的完整性4.4完整性约束命名字句4.1实体完整性关系模型的实体完整性定义CREATETABLE中用PRIMARYKEY定义单属性构成的码有两种说明方法定义为列级约束条件定义为表级约束条件对多个属性构成的码只有一种说明方法定义为表级约束条件实体完整性定义[例]将Student表中的Sno属性定义为码(1)在列级定义主码CREATETABLEStudent(SnoCHAR(9)PRIMARYKEY,SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20));实体完整性定义(2)在表级定义主码CREATETABLEStudent(SnoCHAR(9),SnameCHAR(20)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),PRIMARYKEY(Sno));实体完整性定义[例]将SC表中的Sno,Cno属性组定义为码CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,PRIMARYKEY(Sno,Cno)/*只能在表级定义主码*/);实体完整性检查和违约处理插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括两个方面:1.检查主码值是否唯一,如果不唯一则拒绝插入或修改2.检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改4.2参照完整性关系模型的参照完整性定义在CREATETABLE中用FOREIGNKEY短语定义哪些列为外码,并指明这些外码参照哪些表的主码。参照完整性定义[例]定义SC中的参照完整性CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,PRIMARYKEY(Sno,Cno),/*在表级定义实体完整性*/FOREIGNKEY(Sno)REFERENCESStudent(Sno),/*在表级定义参照完整性*/FOREIGNKEY(Cno)REFERENCESCourse(Cno)/*在表级定义参照完整性*/);参照完整性检查和违约处理可能破坏参照完整性的情况及违约处理拒绝/级连修改/设置为空值可能破坏参照完整性修改主码值拒绝/级连删除/设置为空值(定义外码是否允许空值)可能破坏参照完整性删除元组拒绝修改外码值可能破坏参照完整性拒绝(默认策略)插入元组可能破坏参照完整性违约处理参照表(例如SC)被参照表(例如Student)违约处理[例]显式说明参照完整性的违约处理示例CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINT,PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno)ONDELETECASCADE/*级联删除SC表中相应的元组*/ONUPDATECASCADE,/*级联更新SC表中相应的元组*/FOREIGNKEY(Cno)REFERENCESCourse(Cno)ONDELETENOACTION/*当删除course表中的元组造成了与SC表不一致时拒绝删除*/ONUPDATECASCADE/*当更新course表中的cno时,级联更新SC表中相应的元组*/);4.3用户定义的完整性4.3.1属性上的约束条件的定义4.3.2元组上的约束条件的定义4.3.1属性上的约束条件的定义CREATETABLE时定义列值非空(NOTNULL)列值唯一(UNIQUE)检查列值是否满足一个布尔表达式(CHECK)属性上的约束条件的定义(续)1.不允许取空值[例]在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。CREATETABLESC(SnoCHAR(9)NOTNULL,CnoCHAR(4)NOTNULL,GradeSMALLINTNOTNULL,PRIMARYKEY(Sno,Cno),);属性上的约束条件的定义(续)2.列值唯一[例]建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码CREATETABLEDEPT(DeptnoNUMERIC(2),DnameCHAR(9)UNIQUE,/*要求Dname列值唯一*/LocationCHAR(10),PRIMARYKEY(Deptno));属性上的约束条件的定义(续)3.用CHECK短语指定列值应该满足的条件[例]Student表的Ssex只允许取“男”或“女”。CREATETABLEStudent(SnoCHAR(9)PRIMARYKEY,SnameCHAR(8)NOTNULL,SsexCHAR(2)CHECK(SsexIN(‘男’,‘女’)),/*性别属性Ssex只允许取‘男’或‘女’*/SageSMALLINT,SdeptCHAR(20));元组上的约束条件的定义(续)[例]当学生的性别是男时,其姓名不能以Ms.打头。CREATETABLEStudent(SnoCHAR(9),SnameCHAR(8)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),PRIMARYKEY(Sno),CHECK(Ssex='女'ORSnameNOTLIKE'Ms.%')/*定义了元组中Sname和Ssex两个属性值之间的约束条件*/);性别是女性的元组都能通过该项检查,因为Ssex=‘女’成立;当性别是男性时,要通过检查则名字一定不能以Ms.打头4.4完整性约束命名子句CONSTRAINT完整性约束条件名[PRIMARYKEY短语|FOREIGNKEY短语|CHECK短语]CONSTRAINT约束完整性约束命名子句(续)[例]建立学生登记表Student,要求学号在1~99之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。CREATETABLEStudent(SnoNUMERIC(6)CONSTRAINTC1CHECK(SnoBETWEEN1AND99),SnameCHAR(20)CONSTRAINTC2NOTNULL,SageNUMERIC(3)CONSTRAINTC3CHECK(Sage30),SsexCHAR(2)CONSTRAINTC4CHECK(SsexIN('男','女')),CONSTRAINTStudentKeyPRIMARYKEY(Sno));在Student表上建立了5个约束条件,包括主码约束(StudentKey)以及C1、C2、C3、C4四个列级约束。完整性约束命名子句(续)修改表中的完整性限制使用ALTERTABLE语句修改表中的完整性限制完整性约束命名子句(续)可以先删除原来的约束条件,再增加新的约束条件ALTERTABLEStudentDROPCONSTRAINTC1;ALTERTABLEStudentADDCONSTRAINTC1CHECK(SnoBETWEEN100AND999);ALTERTABLEStudentDROPCONSTRAINTC3;ALTERTABLEStudentADDCONSTRAINTC3CHECK(Sage40);[例]修改表Student中的约束条件,要求学号改为在100~999之间,年龄由小于30改为小于40
本文标题:4第四章 数据库完整性
链接地址:https://www.777doc.com/doc-4893922 .html