《数据库第五章.pptx》由会员分享,可在线阅读,更多相关《数据库第五章.pptx(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据库完整性(续)什么是数据库的完整性数据库的完整性是指数据的正确性和相容性,防止不合语义的数据进入数据库。例:学生的年龄必须是整数,取值范围为14-29;学生的性别只能是男或女;学生的学号一定是唯一的;学生所在的系必须是学校开设的系;数据库是否具备完整性关系到数据库系统能否真实地反映现实世界,因此维护数据库的完整性是非常重要的。第1页/共61页数据库完整性(续)完整性控制机制1.完整性约束条件定义机制2.完整性检查机制3.违约处理 第2页/共61页数据库完整性(续)完整性控制机制(续)1.完整性约束条件定义机制完整性约束条件是数据模型的一个重要组成部分,它约束了数据库中数据的语义。DBMS应
2、提供手段让用户根据现实世界的语义定义数据库的完整性约束条件,并把它们作为模式的一部分存入数据库中。第3页/共61页数据库完整性(续)完整性控制机制(续)2.完整性检查机制检查用户发出的操作请求是否违背了完整性约束条件。一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可在事务提交时检查。第4页/共61页数据库完整性(续)完整性控制机制(续)3.违约处理如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。第5页/共61页第5章 数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户自定义完整性5.4 完整性约束命名子句5.6 触发器5.7
3、 小结第6页/共61页5.1 实体完整性5.1.1 实体完整性定义5.1.2 实体完整性检查和违约处理第7页/共61页5.1 实体完整性5.1.1 实体完整性定义5.1.2 实体完整性检查和违约处理第8页/共61页5.1.1 实体完整性定义实体完整性在CREATE TABLE 中用PRIMARY KEY定义单属性构成的码有两种说明方法:-定义为列级约束条件 -定义为表级约束条件多个属性构成的码只有一种说明方法:-定义为表级约束条件第9页/共61页例题例1 将Student表中的Sno属性定义为码 CREATE TABLE Student (Sno CHAR(9)PRIMARY KEY,Snam
4、e CHAR(20)NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20);注:在列级定义主码 第10页/共61页例题或者:CREATE TABLE Student (Sno CHAR(9),Sname CHAR(20)NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY(Sno);注:在表级定义主码第11页/共61页例题例2 将SC表中的Sno,Cno属性组定义为码 CREATE TABLE SC (Sno CHAR(9)NOT NULL,Cno CHAR(4)NOT NUL
5、L,Grade SMALLINT,PRIMARY KEY(Sno,Cno);注:只能在表级定义主码第12页/共61页5.1 实体完整性5.1.1 实体完整性定义5.1.2 实体完整性检查和违约处理第13页/共61页5.1.2 实体完整性检查和违约处理用PRIMARY KEY短语定义了关系的主码后,每当用户程序对基本表进行插入或更新操作时,RDMS将按照实体完整性规则自动进行检查。-检查主码值是否唯一,如果不唯一则拒绝插入或修改 -检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改第14页/共61页实体完整性检查和违约处理(续)检查记录中主码值是否唯一的一种方法是进行全表扫描。依次判断表
6、中每一条记录的主码值与将插入记录上的主码值(或者修改的新主码值)是否相同。全表扫描是十分耗时的RDBMS核心一般都在主码上自动建立一个索引,通过索引查找基本表中是否已经存在新的主码值,将大大提高效率。第15页/共61页第5章 数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户自定义完整性5.4 完整性约束命名子句5.6 触发器5.7 小结第16页/共61页5.2 参照完整性5.2.1 参照完整性定义5.2.2 参照完整性检查和违约处理第17页/共61页5.2 参照完整性5.2.1 参照完整性定义5.2.2 参照完整性检查和违约处理第18页/共61页5.2.1 参照完整性定义参照完整性
7、在CRETAT TABLE 中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。例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);第19页/共61页5.2 参照完整性5.2.1 参照完整性定义5.2.2 参照完整性检查和违约
8、处理第20页/共61页5.2.2 参照完整性检查和违约处理一个参照完整性将两个表中的相应元组联系起来了,因此对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查。当不一致发生时,系统可以采用以下的策略进行处理 拒绝执行,一般为默认策略 级连操作 设置为空值第21页/共61页参照完整性检查和违约处理(续)当对参照表和被参照表的操作违反了参照完整性,系统采用默认策略。若想让系统采用其他的策略必须在创建表的时候显式地加以说明。例4:CREATE TABLE SC (Sno CHAR(9)NOT NULL,Cno CHAR(4)NOT NULL,Grade SMALLINT,PRIMA
9、RY KEY(Sno,Cno),FOREIGN KEY(Sno)REFERENCES Student(Sno)ON DELETE CASCADE ON UPDATE CASCADE,FOREIGN KEY(Cno)REFERENCES Course(Cno)ON DELETE NO ACTION ON UPDATE CASCADE);第22页/共61页第5章 数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户自定义完整性5.4 完整性约束命名子句5.6 触发器5.7 小结第23页/共61页5.3 用户定义的完整性5.3.1 属性上的约束条件的定义5.3.2 属性上的约束条件检查和违约
10、处理5.3.3 元组上的约束条件的定义5.3.4 元组上的约束条件检查和违约处理第24页/共61页5.3.1 属性上的约束条件的定义在CREATE TABLE 中定义属性的同时可以根据应用要求,定义属性上的约束条件,即属性值限制,包括:-列值非空(NOT NULL短语)-列值唯一(UNIQUE短语)-检查列值是否满足一个布尔表达式(CHECK短语)第25页/共61页例题例5 在定义SC表时,说明Sno,Cno,Grade属性不允许取空值 CREATE TABLE SC (Sno CHAR(9)NOT NULL,Cno CHAR(4)NOT NULL,Grade SMALLINT NOT NUL
11、L,PRIMARY KEY(Sno,Cno);第26页/共61页例题例6 建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码 CREATE TABLE DEPT (Deptno NUMERIC(2),Dname CHAR(9)UNIQUE,Location CHAR(10),PRIMARY KEY(Deptno);第27页/共61页例题例7 Student表的Ssex只允许取“男”或“女”CREATE TABLE Student (Sno CHAR(9)PRIMARY KEY,Sname CHAR(8)NOT NULL,Ssex CHAR(2)CHECK(Sse
12、x IN(男,女),Sage SMALLINT,Sdept CHAR(20);第28页/共61页例题例8 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),FOREIGN KEY(Cno)REFERENCES Course(Cno);第29页/共61页5.3 用户定义的完整性5.3
13、.1 属性上的约束条件的定义5.3.2 属性上的约束条件检查和违约处理5.3.3 元组上的约束条件的定义5.3.4 元组上的约束条件检查和违约处理第30页/共61页5.3.2 属性上的约束条件检查和违约处理当往表中插入元组或修改属性的值时,RDBMS就检查属性上的约束条件是否被满足,若不满足则操作被拒绝执行。第31页/共61页5.3 用户定义的完整性5.3.1 属性上的约束条件的定义5.3.2 属性上的约束条件检查和违约处理5.3.3 元组上的约束条件的定义5.3.4 元组上的约束条件检查和违约处理第32页/共61页5.3.3 元组上的约束条件的定义在CREATE TABLE 语句中可以用CH
14、ECK短语定义元组上的约束条件,即元组级的限制。元组级的限制可以设置不同属性之间的取值的相互约束条件第33页/共61页例题 例9 当学生的性别是男时,其名字不能以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 Sname NOT LIKE Ms.%);第34页/共61页5.3 用户定义的完整性5.3.1 属性上的约束条件的定义5.3.2 属性上的约束条件检查和违约处理5.3
15、.3 元组上的约束条件的定义5.3.4 元组上的约束条件检查和违约处理第35页/共61页5.3.4 元组上的约束条件检查和违约处理当往表中插入元组或修改属性的值时,RDBMS就检查元组上的约束条件是否被满足,如果不满足则操作被拒绝执行。第36页/共61页第5章 数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户自定义完整性5.4 完整性约束命名子句5.6 触发器5.7 小结第37页/共61页5.4 完整性约束命名子句SQL还在CREATE TABLE 语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名。从而可以灵活地增加、删除一个完整性约束条件完整性约束命名
16、子句 CONSTRAINT PRIMARY KEY短语FOREIGN KEY 短语CHECK短语第38页/共61页例题例10 建立学生登记表Student,要求学号在90000-99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。CREATE TABLE Student (Sno NUMERIC(6)CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 99999),Sname CHAR(20)CONSTRAINT C2 NOT NULL,Sage NUMERIC(3)CONSTRAINT C3 CHECK(Sage=3000);第40页/共
17、61页修改表中的完整性限制可以使用ALTER TABLE 语句修改表中的完整性限制 例12 去掉student表中对性别的限制 ALTER TABLE Student DROP CONSTRAINT C4;第41页/共61页例题例13 修改表Student中的约束条件,要求学号改为在900000-999999之间,年龄由小于30改为小于40 可以先删除再增加 ALTER TABLE Student DROP CONSTRAINT C1;ALTER TABLE Student ADD CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 999999);ALTER
18、 TABLE Student DROP CONSTRAINT C3;ALTER TABLE Student ADD CONSTRAINT C3 CHECK(Sage40);第42页/共61页第5章 数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户自定义完整性5.4 完整性约束命名子句5.6 触发器5.7 小结第43页/共61页5.6 触发器触发器是用户定义在关系表上的一类由事件驱动的特殊过程一旦定义,任何用户对表的增、删、改操作均由服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。类似于约束,但比约束更加灵活,可以实施比FOREIGN KEY约束、CHECK约束更为
19、复杂的检查和操作,具有更精细和更强大的数据控制能力。第44页/共61页5.6 触发器5.6.1 定义触发器5.6.2 激活触发器5.6.3 删除触发器第45页/共61页5.6.1 定义触发器SQL使用CREATE TRIGGER命令建立触发器,一般格式为:CREATE TRIGGER BEFOREAFTER ON FOR EACH ROWSTATEMENT WHEN 第46页/共61页定义触发器(续)表的拥有者即创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器。触发器名可以包含模式名,也可以不包含模式名。同一模式下,触发器名必须是唯一的;且触发器名和表名必须在同一模式下
20、。当表的数据发生变化时,将激活定义在表上相应触发事件的触发器,因此,表也被称为触发器的目标表触发事件可以是INSERT、DELETE或UPDATE,也可以是这几个事件的组合。UPDATE后面还可以有OF,用于进一步指明修改哪些列时触发器激活。第47页/共61页定义触发器(续)按照所触发动作的间隔尺寸可以分为行级触发器(FOR EACH ROW)和语句级触发器(FOR EACH STATEMENT)语句级触发器触发动作只执行一次,行级触发器的触发动作执行的次数与涉及到的元组数相关触发器被激活时,只有当触发条件为真时触发动作体才执行;否则触发动作体不执行,若省略WHEN触发条件,则触发动作体在触发
21、器激活后立即执行触发动作体既可以是一个匿名PL/SQL过程块,也可以是对已创建存储过程的调用。第48页/共61页定义触发器(续)在行级触发器中,不管是匿名PL/SQL过程块还是对已创建存储过程的调用,用户都可以在过程体中使用NEW和OLD引用UPDATE/INSERT事件之后的新值和UPDATE/DELETE事件之前的旧值。若是语句级触发器,则不能在触发动作体中使用NEW或OLD进行引用。若触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化。第49页/共61页例题例18 定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“
22、教授的工资不得低于4000元,若低于4000元,自动改为4000元”CREATE TRIGGER Insert_Or_Update_Sal BEFORE INSERT OR UPDATE ON Teacher FOR EACH ROW AS BEGIN IF(new.Job=教授)AND(new.Sal4000)THEN new.Sal:=4000;END IF;END;第50页/共61页例题(续)例19 定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录 先建立工资变化表Sal_log:CREATE TABLE Sal_lot
23、(Eno NUMERIC(4)REFERENCES teacher(Eno),Sal NUMERIC(7,2),Username CHAR(10),Date TIMESTAMP);第51页/共61页例题(续)接着分别为INSERT和UPDATE操作创建触发器:CREATE TRIGGER Insert_Sal AFTER INSERT ON Teacher FOR EACH ROW AS BEGIN INSERT INTO Sal_log VALUES (new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);END;第52页/共61页例题(续)CREA
24、TE TRIGGER Update_Sal AFTER UPDATE ON Teacher FOR EACH ROW AS BEGIN IF(new.Salold.Sal)THEN INSERT INTO Sal_log VALUES (new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);END IF;END;第53页/共61页5.6 触发器5.6.1 定义触发器5.6.2 激活触发器5.6.3 删除触发器第54页/共61页5.6.2 激活触发器由触发事件激活,并由数据库服务器自动执行若一个表上有多个触发器,在激活时遵循如下的执行顺序:1.先执行该表
25、上的BEFORE触发器 2.接着激活触发器的SQL语句 3.最后执行该表上的AFTER触发器同一个表上的多个BEFORE(AFTER)触发器,遵循先创建先执行的原则第55页/共61页例题例20 执行修改某个教师工资的SQL语句,激活前面定义的触发器 UPDATE Teacher SET Sal=800 WHERE Ename=陈平;执行顺序是:执行触发器Insert_Or_Update_Sal 执行SQL语句 执行触发器Insert_Sal 执行触发器Update_Sal第56页/共61页5.6 触发器5.6.1 定义触发器5.6.2 激活触发器5.6.3 删除触发器第57页/共61页5.6.
26、3 删除触发器SQL语句如下:DROP TRIGGER ON;-触发器必须是一个已经创建的触发器,且只能由具有相应权限的用户删除例21 删除教师表Teacher上的触发器Insert_Sal DROP TRIGGER Insert_Sal ON Teacher;第58页/共61页第5章 数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户自定义完整性5.4 完整性约束命名子句5.6 触发器5.7 小结第59页/共61页5.7 小结数据库的完整性是为了保证数据库中存储的数据是正确的在关系系统中,最重要的完整性是实体完整性和参照完整性完整性的定义一般由SQL的DDL语句来实现,存储在数据字典中完整性机制的实施会影响系统性能实现数据库完整性的一个重要方法是触发器第60页/共61页感谢您的观看。第61页/共61页