《数据库-第五章数据库完整性.doc》由会员分享,可在线阅读,更多相关《数据库-第五章数据库完整性.doc(6页珍藏版)》请在金锄头文库上搜索。
1、 第五章 数据库完整性1. 相关简介(了解):(1) 概念:数据库的完整性是指数据的正确性和相容性(2) 数据库的完整性与安全性区别:数据库的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据数据的安全性是保护数据库防止恶意的破坏和非法的获取。(3) 为维护数据库的完整性,DBMS能够*提供定义完整性约束条件的机制完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件*提供完整性检查的方法DBMS中检查数据是否满足完整性约束条件的机制称为完整性检查(INSERT、UPDATE)*违约处理DBMS若发现用户的操作违背了完整性约束条件,就采取一定的动作
2、,如拒绝(NO ACTION)执行该操作,或级联(CASCADE)执行其他操作,进行违约处理以保证数据的完整性。2. 实体完整性(主属性非空)(1) 实体完整性定义(列级约束条件+表级约束条件)关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法,列级约束条件+表级约束条件;对多属性构成的码有一种说明方法,即定义为表级约束条件。(2) 实例:*将Student表中的Sno属性定义为码:CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY, /在列级定义主码Sname CHAR(20) NOT NULL,
3、Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20);或者CREATE TABLE Student(Sno CHAR(9) , Sname CHAR(20) NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY (Sno) /在表级定义主码);*将SC表中的Sno,Cno属性定义为码: CREATE TABLE SC(Sno CHAR(9) NOT NULL, /*NOT NULL可以去掉,主属性非空,Cno CHAR(4) NOT NULL, 下面已经定义*/Grade SMALLINT,
4、PRIMARY KEY (Sno,Cno) /只能在表级定义主码);(3) 实体完整性检查(插入INSERT、更新UPDATE)和违约处理保证实体完整性,包括:*检查主码值是否唯一(进行全表扫描),如果不唯一则拒绝插入或修改*检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改3. 参照完整性(对外码取值进行限制)关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义为哪些列为外码,用REFERENCES 短语指明这些外码参照哪些表的主码。(外码:是一个表的主码是另一个表的外码)() 例题:关系中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码
5、,Sno,Cno分别参照引用Student表的主码和Course表的主码,定义中的参照完整性CREATE TABLE SC(Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT,PRIMARY KEY (Sno,Cno), /在表级定义实体完整性FOREIGN KEY(Sno) REFERENCES Student(Sno),/在表级定义参照完整性 FOREIGN KEY(Cno) REFERENCES Course(Cno) /在表级定义参照完整性);(2) 参照完整性检查(增删改)和违约处理一个参照完整性将两个表中的相应元组联
6、系起来了,因此,对被参照表和参照表进行增删改操作时可能破坏参照完整性,必须进行检查*违约处理:a拒绝(NO ACTION)执行b级联(CASCADE)操作当删除或修改被参照表的一个元组造成了与参照表(有外码的表)的不一致,则删除或修改参照表中的所有造成不一致的元组c设置成空值当删除或修改被参照表的一个元组造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值注意:对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值;一般地,当参照表和被参照表的操作违反了参照完整性,系统采用默认策略,即拒绝执行,如果想让系统采用其他的策略则必须在创建表的时候显示的加以说明实例:显示说明参照
7、完整性的违约处理示例CREATE TABLE SC(Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT,PRIMARY KEY (Sno,Cno), /在表级定义实体完整性FOREIGN KEY(Sno) REFERENCES Student(Sno),/在表级定义参照完整性 ON DELETE CASCADE/当删除student表中的元组时,级联删除SC表中的相应的元组 ON UPDATE CASCADE,/当更新student表中的Sno时,级联更新SC表中的相应的元组 FOREIGN KEY(Cno) REFERENCE
8、S Course(Cno) /在表级定义参照完整性 ON DELETE NO ACTION/当删除course表中的元组造成了与SC表不一致时拒绝删除 ON UPDATE CASCADE/当更新course表中的cno时,级联更新SC表中相应的元组 );可以对DELETE 和 UPDATE采用不同的策略4. 用户定义的完整性(1) 属性上的约束条件的定义在CREATE TABLE中定义属性的同时可以根据应用要求,定义属性列上的约束条件,即属性值限制,包括:*列值非空(NOT NULL短语)*列值唯一(UNIQUE 短语)*检查列值是否满足一个布尔表达式(CHECK 短语)不允许取空值实例:在定
9、义SC表时,说明Sno、Con、Grade属性不允许取空值CREATE TABLE SC(Sno CHAR(9) NOT NULL, /Sno属性不允许取空值(不必写了)Cno CHAR(4) NOT NULL, / Cno 属性不允许取空值(不必写了)Grade SMALLINT NOT NULL ,/Grade 属性不允许取空值PRIMARY KEY (Sno,Cno),( /在表级定义实体完整性(如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值则在列级不允许取空值的定义就不必写了) );列值唯一实例:建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为
10、主码 CREATE TABLE DEPT( Deptno NUMERIC(2),Dname CHAR(9) UNIQUE, /部门名称Dname列取值唯一Location CHAR(10),PRIMARY KEY (Deptno);用CHECK 短语指定列值应该满足的条件实例:*Student表的Ssex只允许取“男”或“女”CREATE TABLE Student( Sno CHAR(9) PRIMARY KEY,/在列级定义主码Sname CHAR(8) NOT NULL, /Sname属性不允许取空值Ssex CHAR(2) CHECK(Ssex IN(男,女),/性别属性Ssex只允许
11、取男或女(单引号是英文状态下的)Sage SMALLINT,Sdept CHAR(20);*SC表的Grade的值应该在0和100之间CREATE TABLE SC(Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT CHECK(Grade=0 AND Grade+100),PRIMARY KEY (Sno,Cno), /在表级定义实体完整性FOREIGN KEY(Sno) REFERENCES Student(Sno),/在表级定义参照完整性);(2) 属性上的约束条件检查和违约处理当往表中插入元组或修改属性的值,RDBMS就
12、检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行(3) 元组上的约束条件的定义与属性上约束条件的定义类似,在CREATE TABLE语句中可以用CHECK短语定义元组上的约束条件,即元组级的限制。同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件实例:当学生的性别为男时,其名字不能以Ms.打头CREATE TABLE Student( Sno CHAR(9) ,Sname CHAR(8) NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY(Sno),CHECK (Ssex=女 OR Snam
13、e NOT LIKEMs.%) /“%”任意多个字符,“-”任意单个字符);/定义了元组中Sname和Ssex两个属性值之间的约束条件5. 完整性约束命名字句(1) 完整性约束命名子句CONSTRAINTPRIMARY KEY短语|FOREIGN KEY短语|CHECK短语实例1:建立学生登记表Student,要求学号在9000099999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。CREATE TABLE Student(Sno NUMERIC(6) /数值型NUMERICCONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),S
14、name CHAR(20)CONSTRAINT C2 NOT NULL,Sage NUMERIC(3)CONSTRAINT C3 CHECK(Sage30),Ssex CHAR(2)CONSTRAINT C4 CHECK(Ssex IN(男,女),CONSTRAINT StudentKey PRIMARY KEY(Sno);C1,C2,C3,C4是列级约束,另外还有一个主码约束(命名为StudentKey)实例2:建立教师表TEACHER,要求每个教师的应发工资不低于3000元。应发工资实际上就是实发工资列Sal与扣除Deduct之和。CREATE TABLE TEACHER(Eno NUMERIC(4) PRIMARY KEY, /在列级定义主码Ename CHAR(20),Job CHAR(8),Sal NUMERIC(7,2)