《数据库技术课件Chapter5数据库完整性.pptx》由会员分享,可在线阅读,更多相关《数据库技术课件Chapter5数据库完整性.pptx(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据库原理数据库原理Principle of Database Systems第五章 数据库完整性刘洁2数据库完整性n数据库的完整性是指数据的正确性和相容性n数据的完整性和安全性是两个不同概念n数据的完整性n防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据n防范对象:不合语义、不正确的数据n数据的安全性n保护数据库防止恶意的破坏和非法的存取n防范对象:非法用户和非法操作3为维护数据库的完整性,DBMS必须能够n提供定义完整性约束条件的机制n提供完整性检查的方法n违约处理4第五章 数据库完整性n5.1 实体完整性n5.2 参照完整性n5.3 用户定义的完整性n5.4 完整性约
2、束命名子句n*5.5 域中的完整性限制n5.6 触发器n5.7 小结55.1 实体完整性n5.1.1 实体完整性定义n5.1.2 实体完整性检查和违约处理65.1.1 实体完整性定义n关系模型的实体完整性nCREATE TABLE中用PRIMARY KEY定义n单属性构成的码有两种说明方法n定义为列级约束条件n定义为表级约束条件n对多个属性构成的码只有一种说明方法n定义为表级约束条件7例1.将Student表中的Sno属性定义为码nCREATE TABLE Studentn(Sno CHAR(9)PRIMARY KEY,nSname CHAR(20)NOT NULL,nSsex CHAR(2)
3、,nSage SMALLINT,nSdept CHAR(20)n);nCREATE TABLE Studentn(Sno CHAR(9),nSname CHAR(20)NOT NULL,nSsex CHAR(2),nSage SMALLINT,nSdept CHAR(20),nPRIMARY KEY(Sno)n);在列级定义主码在列级定义主码在表级定义主码在表级定义主码8实体完整性定义n例2.将SC表中的Sno,Cno属性组定义为码nCREATE TABLE SCn(Sno CHAR(9)NOT NULL,nCno CHAR(4)NOT NULL,nGrade SMALLINT,nPRIMAR
4、Y KEY(Sno,Cno)/*只能在表级定义主码*/n);95.1.2 实体完整性检查和违约处理n插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括:n检查主码值是否唯一,如果不唯一则拒绝插入或修改n检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改10实体完整性检查和违约处理n检查记录中主码值是否唯一的一种方法是进行全表扫描11实体完整性检查和违约处理n索引,e.g.B+树索引125.2 参照完整性n5.2.1 参照完整性定义n5.2.2 参照完整性检查和违约处理135.2.1 参照完整性定义n关系模型的参照完整性定义n在CREATE TABLE中用FOR
5、EIGN KEY短语定义哪些列为外码n用REFERENCES短语指明这些外码参照哪些表的主码14例3.定义SC中的参照完整性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)/*在表级定义参照完整性*/);15可能破坏参照完整性的情况及违约处理16参照完
6、整性违约处理n拒绝(NO ACTION)执行n默认策略n级连(CASCADE)操作n设置为空值(SET NULL)n对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值17例4.显式说明参照完整性的违约处理示例nCREATE TABLE SCn(Sno CHAR(9)NOT NULL,nCno CHAR(4)NOT NULL,nGrade SMALLINT,nPRIMARY KEY(Sno,Cno),nFOREIGN KEY(Sno)REFERENCES Student(Sno)nON DELETE CASCADE/*级连删除SC表中相应的元组*/nON UPDATE CASCADE,
7、/*级连更新SC表中相应的元组*/nFOREIGN KEY(Cno)REFERENCES Course(Cno)nON DELETE NO ACTION/*当删除Course 表中的元组造成了与SC表不一致时拒绝删除*/nON UPDATE CASCADE/*当更新Course表中的Cno时,级连更新SC表中相应的元组*/n);185.3 用户定义的完整性n用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求nRDBMS提供,而不必由应用程序承担195.3 用户定义的完整性n5.3.1 属性上的约束条件的定义n5.3.2 属性上的约束条件检查和违约处理n5.3.3 元组上的约束条件的定
8、义n5.3.4 元组上的约束条件检查和违约处理205.3.1 属性上的约束条件的定义n在CREATE TABLE中定义属性的同时可以根据应用要求,定义属性上的约束条件,即属性值限制,包括:n列值非空(NOT NULL)n列值唯一(UNIQUE)n检查列值是否满足一个布尔表达式(CHECK)21属性上的约束条件的定义n不允许取空值n例5.在定义SC表时,说明Sno、Cno、Grade属性不允许取空值nCREATE TABLE SCn(Sno CHAR(9)NOT NULL,nCno CHAR(4)NOT NULL,nGrade SMALLINT NOT NULL,nPRIMARY KEY(Sno
9、,Cno),n/*如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值,则在列级不允许取空值的定义就不必写了*/n);22属性上的约束条件的定义n列值唯一n例6.建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码nCREATE TABLE DEPTn(Deptno NUMERIC(2),nDname CHAR(9)UNIQUE,/*要求Dname列值唯一*/nLocation CHAR(10),nPRIMARY KEY(Deptno)n);23属性上的约束条件的定义n用CHECK短语指定列值应该满足的条件n例7.Student表的Ssex只允许取“男”或“
10、女”nCREATE TABLE Studentn(Sno CHAR(9)PRIMARY KEY,nSname CHAR(8)NOT NULL,nSsex CHAR(2)CHECK(Ssex IN(男,女),n/*性别属性Ssex只允许取男或女*/nSage SMALLINT,nSdept CHAR(20)n);245.3.2 属性上的约束条件检查和违约处理n插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足n如果不满足则操作被拒绝执行255.3.3 元组上的约束条件的定义n在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制n同属性值限制相比,元
11、组级的限制可以设置不同属性之间的取值的相互约束条件26n例9.当学生的性别是男时,其名字不能以Ms.打头nCREATE TABLE Studentn(Sno CHAR(9),nSname CHAR(8)NOT NULL,nSsex CHAR(2),nSage SMALLINT,nSdept CHAR(20),nPRIMARY KEY(Sno),nCHECK(Ssex=女 OR Sname NOT LIKE Ms.%)n/*定义了元组中Sname和Ssex两个属性值之间的约束条件*/n);n性别是女性的元组都能通过该项检查,因为Ssex=女成立;n当性别是男性时,要通过检查则名字一定不能以Ms.
12、打头275.3.4 元组上的约束条件检查和违约处理n插入元组或修改属性的值时,RDBMS检查元组上的约束条件是否被满足n如果不满足则操作被拒绝执行285.4 完整性约束命名子句nCONSTRAINT 约束nCONSTRAINT PRIMARY KEY短语|FOREIGN KEY短语|CHECK短语29n例10.建立学生登记表Student,要求学号在9000099999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”nCREATE TABLE Studentn(Sno NUMERIC(6)nCONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 9999
13、9),nSname CHAR(20)nCONSTRAINT C2 NOT NULL,nSage NUMERIC(3)nCONSTRAINT C3 CHECK(Sage 30),nSsex CHAR(2)nCONSTRAINT C4 CHECK(Ssex IN(男,女),nCONSTRAINT StudentKey PRIMARY KEY(Sno)n);n在Student表上建立了5个约束条件,包括主码约束(命名为 StudentKey)以及C1、C2、C3、C4四个列级约束30修改表中的完整性限制n使用ALTER TABLE语句修改表中的完整性限制31n例13.修改表Student中的约束条件
14、,要求学号改为在900000999999之间,年龄由小于30改为小于40可以先删除原来的约束条件,再增加新的约束条件nALTER TABLE StudentnDROP CONSTRAINT C1;nALTER TABLE StudentnADD CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 999999),nALTER TABLE StudentnDROP CONSTRAINT C3;nALTER TABLE StudentnADD CONSTRAINT C3 CHECK(Sage 40);325.5 域中的完整性限制nSQL支持域的概念,并可以用CRE
15、ATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件n例14.建立一个性别域,并声明性别域的取值范围nCREATE DOMAIN GenderDomain CHAR(2)nCHECK(VALUE IN(男,女);n这样例10中对Ssex的说明可以改写为nSsex GenderDomain33n例15.建立一个性别域GenderDomain,并对其中的限制命名nCREATE DOMAIN GenderDomain CHAR(2)nCONSTRAINT GD CHECK(VALUE IN(男,女);n例16.删除域GenderDomain的限制条件GDnALTER DOMAIN Ge
16、nderDomainnDROP CONSTRAINT GD;n例17.在域GenderDomain上增加限制条件GDD。nALTER DOMAIN GenderDomainnADD CONSTRAINT GDD CHECK(VALUE IN(1,0);n通过例16和例17,就把性别的取值范围由(男,女)改为(1,0)345.6 触发器n触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程n由服务器自动激活n可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力355.6 触发器n5.6.1 定义触发器n5.6.2 激活触发器n5.6.3 删除触发器365.6.1 定义
17、触发器nCREATE TRIGGER语法格式nCREATE TRIGGER nBEFORE|AFTER ON nFOR EACH ROW|STATEMENTnWHEN n37定义触发器的语法说明n创建者:表的拥有者n触发器名n表名:触发器的目标表n触发事件:INSERT、DELETE、UPDATEn触发器类型n行级触发器(FOR EACH ROW)n语句级触发器(FOR EACH STATEMENT)n触发条件n触发条件为真,or 省略WHEN触发条件n触发动作体n触发动作体可以是一个匿名PL/SQL过程块n也可以是对已创建存储过程的调用38n例如,假设在例11的TEACHER表上创建了一个A
18、FTER UPDATE触发器。如果表TEACHER有1000行,执行如下语句:nUPDATE TEACHER SET Deptno=5;n如果该触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次n如果是行级触发器,触发动作将执行1000次39n例18.定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”nCREATE TRIGGER Insert_Or_Update_SalnBEFORE INSERT OR UPDATE ON Teachern/*触发事件是插入或更新操作*/nFOR EACH R
19、OW/*行级触发器*/nAS BEGIN/*定义触发动作体,是PL/SQL过程块*/nIF(new.Job=教授)AND(new.Sal 4000)THENnnew.Sal:=4000;nEND IF;nEND;40n例19.定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录n首先建立工资变化表Sal_lognCREATE TABLE Sal_logn(Eno NUMERIC(4)REFERENCES teacher(eno),nSal NUMERIC(7,2),nUsername char(10),nDate TIMESTAMP
20、n);41nCREATE TRIGGER Insert_SalnAFTER INSERT ON Teacher/*触发事件是INSERT*/nFOR EACH ROWnAS BEGINnINSERT INTO Sal_log VALUES(new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);nEND;42nCREATE TRIGGER Update_SalnAFTER UPDATE ON Teacher nFOR EACH ROWnAS BEGINnIF(new.Sal old.Sal)THEN INSERT INTO Sal_log VALUES(
21、new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);nEND IF;nEND;435.6.2 激活触发器n触发器的执行,是由触发事件激活的,并由数据库服务器自动执行n一个数据表上可能定义了多个触发器n同一个表上的多个触发器激活时遵循如下的执行顺序:n执行该表上的BEFORE触发器n激活触发器的SQL语句n执行该表上的AFTER触发器44n例20.执行修改某个教师工资的SQL语句,激活上述定义的触发器nUPDATE Teacher SET Sal=800 WHERE Ename=陈平;n执行顺序:n执行触发器Insert_Or_Update_Saln执
22、行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename=陈平;”n执行触发器Insert_Saln执行触发器Update_Sal455.6.3 删除触发器n删除触发器的SQL语法:nDROP TRIGGER ON;n触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除n例21.删除教师表Teacher上的触发器Insert_SalnDROP TRIGGER Insert_Sal ON Teacher;465.7 小结n数据库的完整性是为了保证数据库中存储的数据是正确的nRDBMS完整性实现的机制n完整性约束定义机制n完整性检查机制n违背完整性约束条件时RDBMS应采取的动作