版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章视图和触发器学习目标掌握索引的创建;视图的创建;管理视图;通过视图修改数据;创建、删除触发器13了解查看索引信息的方式;触发器的概念;触发器的常见应用2理解索引的概念和分类掌握了解熟悉
触发器是一种与表操作(INSERT、UPDATE、DELETE)有关的数据库对象。触发器定义了一系列操作,这一系列操作称为触发程序。当触发器所在表上出现INSERT、UPDATE以及DETETE操作时,将激活触发器,即表的操作事件触发表上的触发程序的执行。
触发器基于一个表创建,但是可以针对多个表进行操作,所以触发器可以用来对表实施复杂的完整性约束。7.4触发器概念和创建触发器7.4.1触发器概述触发器具有以下优点:(1)触发器自动执行。当对表进行INSERT、UPDATE以及DETETE操作,试图修改表中的数据时,相应操作的触发器立即自动执行。(2)触发器可以通过数据库中相关表进行层叠更改。这比直接把代码写在前台的做法更安全合理。(3)触发器可以实现用CHECK约束实现不了的复杂约束。与CHECK约束相比,触发器可以引用其他表中的列。(4)触发器可以维护冗余数据,实现外键级联选项等。7.4触发器概念和创建触发器7.4.2触发器的优点CREATETRIGGER语句语法格式如下:CREATETRIGGER触发器名AFTER/BEFOREINSERT/UPDATE/DELETEON表名FOREACHROWBEGINSQL语句;#触发程序END;7.4触发器概念和创建触发器7.4.3创建触发器需要说明的是:(1)触发器是数据库对象,因此创建触发器时,需要指定该触发器属于哪一个数据库。(2)触发器是在表是创建的。这个表必须是基表,不能是临时表,也不能是视图。7.4触发器概念和创建触发器7.4.3创建触发器(3)MySQL的触发事件有三种:INSERT、UPDATE及DELETE。INSERT:将新记录插入表时激活触发程序。UPDATE:更改表中的记录时激活触发程序。DELETE:从表中删除记录叶激活触发程序。(4)触发器的触发时间有两种:BEFORE和AFTER。BEFORE表示在触发事件发生之前执行触发程序,AFTER表示在触发事件发生之后执行触发程序。(5)FOREACHROW表示行级触发器。
目前,MySQL仅支持行级触发器,不支持语句级别的触发器。FOREACHROW表示INSERT、UPDATE及DELETE操作影响的每一条记录都会执行一次触发程序。(6)触发程序中的SELECT语句不能产生结果集。7.4触发器概念和创建触发器7.4.3创建触发器(7)触发程序中可以使用old关键字与new关键字。①当向表中插入新记录时,在触发程序中可以使用new关键字表示新记录。当需要访问新记录中的某个字段时,可以使用“new.字段名”进行访问。②当从表中删除某条旧记录时,在触发程序中可以使用old关键字表示旧记录。当需要访问旧记录中的某个字段时,可以使用“old.字段名”进行访问。7.4触发器概念和创建触发器7.4.3创建触发器③当修改表中的某条记录时,在触发程序中可以使用new关键字表示修改后的记录。使用old关键字表示修改前的记录。当需要访问修改后的记录中的某个字段时,可以使用“new.字段名”进行访问。当需要访问旧记录中的某个字段时,可以使用“old.字段名”进行访问。④old记录是只读的,在触发程序中只能引用它,但不能更改它。在BEFORE触发程序中,可使用“SETnew.字段名=值”更改new记录的值。但在AFTER触发程序中,不能使用“SETnew.字段名=值”更改new记录的值。⑤对于INSERT操作,只有new是合法的。对于DELETE操作,只有old是合法的。对于UPDATE操作,new和old都是合法的。一、使用触发器实现检查约束
使用触发器实现检查约束,在向elective表插入记录时,score字段的值或者为空,或者是在0~100之间。如果score字段的值不满足要求,则将score的值改成在指定范围内。7.4触发器概念和创建触发器7.4.4触发器的使用实例7-30对应的SQL语句如下:DELIMITER//CREATETRIGGERtr_elective_insertBEFOREINSERTONelectiveFOREACHROWBEGINIF(new.scoreISNOTNULL&&new.score<0)THENSETnew.score=0;ELSEIF(new.scoreISNOTNULL&&new.score>100)THENSETnew.score=100;ENDIF;END;//DELIMITER;使用触发器实现检查约束,在对elective表修改记录时,修改的记录score字段的值或者为空,或者是在0~100之间。如果score字段的值不满足要求,则记录不能修改。对应的SQL语句如下:DELIMITER//CREATETRIGGERtr_elective_UPDATEBEFOREUPDATEonelectiveFOREACHROWBEGINIF(new.scoreISNOTNULL&&new.scoreNOTBETWEEN0AND100)THENSETnew.score=old.score;ENDIF;END;//DELIMITER;7.4触发器概念和创建触发器实例7-31二、使用触发器维护冗余数据
使用触发器实现:当一位老师退休或调离时,将该老师的信息放old_teacher表中。DELIMITER//CREATETRIGGERtr_teacher_deleteAFTERDELETEonteacherFOREACHROWBEGININSERTINTOold_teacher(tname,tgender,tedu,tpro)VALUES(old.tname,old.tgender,old.tedu,old.tpro);END;//DELIMITER;7.4触发器概念和创建触发器实例7-32三、使用触发器实现外键级联选项
对于InnoDB存储引擎的表而言,由于支持外键约束关系,在定义外键约束时,通过设置外键级联选项CASCADE、SETNULL或者NOACTION(RESTRICT),外键约束关系可以交由InnoDB存储引擎自动维护。外键级联选项CASCADE、SETNULL或者NOACTION(RESTRICT)含义如下:7.4触发器概念和创建触发器1.CASCADE:从父表中删除或更新对应的行,同时自动的删除或更新子表中匹配的行。ONDELETECANSCADE和ONUPDATECANSCADE都被InnoDB所支持。2.SETNULL:从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOTNULL时才有效。ONDELETESETNULL和ONUPDATESETSETNULL都被InnoDB所支持。3.NOACTION:InnoDB拒绝删除或者更新父表。4.RESTRICT:拒绝删除或者更新父表。指定RESTRICT(或者NOACTION)和忽略ONDELETE或者ONUPDATE选项的效果是一样的。
对于InnoDB存储引擎的表之间存在外键约束关系但不存在级联选项;或者使用的数据库表为MyISAM(MyISAM表不支持外键约束关系),此时可以使用触发器来实现外键约束之间的级联选项。
创建“后勤管理”数据库,数据库中有学生表stu和宿舍表dorm,学生表stu中有学号sno,姓名sname,性别sgender,班级sclass等字段,主键为学号sno,宿舍表dorm中有宿舍号dno,床位号bno,学号sno等字段,宿舍号dno和床位号bno联合起来做主键,分别用触发器实现宿舍表dorm的学号sno和学生表stu的学号sno字段之间的外键级联选项CASCADE、SETNULL。7.4触发器概念和创建触发器实例7-33(1)创建触发器tr_1,实现宿舍表dorm中学号sno字段和学生表stu学号sno字段的外键CASCADE级联选项,当学生表stu中删除某个学生时,宿舍表dorm中对应学生的住宿记录也删除。DELIMITER//CREATETRIGGERtr_1BEFOREDELETEONstuFOREACHROWBEGINIF(EXISTS(SELECT*FROMdormWHEREsno=old.sno))THENDELETEFROMdormWHEREsno=old.sno;ENDIF;END;//DELIMITER;7.4触发器概念和创建触发器(2)创建触发器tr_2,实现宿舍表dorm中学号sno字段和学生表stu中学号sno字段的外键SETNULL级联选项,当学生表中修改某个的学生学号时,宿舍表中对应记录的学号设为NULL。DELIMITER//CREATETRIGGERtr_2BEFOREUPDATEONstuFOREACHROWBEGINIF(EXISTS(SELECT*FROMdormWHEREsno=old.sno))THENUPDATEdormSETsno=NULLWHEREsno=old.sno;ENDIF;END;//DELIMITER;7.4触发器概念和创建触发器(1)使用SHOWTRIGGERS命令查看触发器的定义。
使用“SHOWTRIGGERS\G”命令可以查看当前数据库中所有触发器的信息。使用“SHOWTRIGGERLIKE模式\G”命令查看与模式模糊匹配的触发器的信息。
查看前面stu表上创建的触发器的信息。
对应的SQL语句如下:SHOWTRIGGERLIKE‘stu%’\G注意:当使用一个含有SHOWTRIGGERS的LIKE子句时,待匹配的表达式(expr)会与触发器定义时所在的表的名称相比较,而不与触发器的名称相比较。7.4触发器概念和创建触发器7.4.4查看触发器的定义实例7-34(2)使用SHOWCREATETRIGGER命令查看触发器的定义。
使用“SHOWCREATETRIGGER触发器名”命令可以查看指定名称的触发器的定义。(3)通过查询information_schema数据库中的triggers表,可以查看触发器的定义。MySQL中所有触发器的定义都存放在information_schema数据库里的triggers表中,查询triggers表时,可以查看所有数据库中所有触发器的详细信息,查询语句如下:SELECT*FROMinformation_schema.triggers\G7.4触发器概念和创建触发器如果某个触发器不再使用,可以使用DROPTRIGGER语句将其删除。DROPTRIGGER语句语法如下
DROPTRIGGER触发器名;7.4触发器概念和创建触发器7.4.5删除触发器索引是一种特殊类型的数据对象,它可以用来提高表中数据的访问速度,而且还
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 鞋厂冲裁管理制度
- java用socket做课程设计
- 学校例会升旗考勤制度
- 店面员工考勤制度
- 广西河池市环江县2025-2026学年秋季学期期末调研测试七年级生物试卷(无答案)
- 小学请假考勤制度
- 局干部考核考勤制度
- 崇州捷普员工考勤制度
- 工作队严格考勤制度
- 工地劳务考勤制度
- 定期存款合同范本
- YYT 0907-2013 医用无针注射器-要求与试验方法
- JT-T-697.13-2016交通信息基层数据元第13部分:收费公路信息基层数据元
- 汽车铸造零件未注公差尺寸的极限偏差
- 产后出血护理病例讨论范文
- 教、学、评一体化的小学语文课堂作业设计研究
- 蔬菜介绍及栽培技术课件
- 小小科学家物理(初中组)课时力学一
- 万物皆数读后感10篇
- 【《中国近现代史纲要》教学案例】第七章+为新中国而奋斗
- GB/T 19215.1-2003电气安装用电缆槽管系统第1部分:通用要求
评论
0/150
提交评论