收藏 分享(赏)

MySQL数据库基础与实例教程第7章.ppt

上传人:精品资料 文档编号:11263307 上传时间:2020-03-06 格式:PPT 页数:62 大小:1.29MB
下载 相关 举报
MySQL数据库基础与实例教程第7章.ppt_第1页
第1页 / 共62页
MySQL数据库基础与实例教程第7章.ppt_第2页
第2页 / 共62页
MySQL数据库基础与实例教程第7章.ppt_第3页
第3页 / 共62页
MySQL数据库基础与实例教程第7章.ppt_第4页
第4页 / 共62页
MySQL数据库基础与实例教程第7章.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

1、,孔祥盛,MySQL数据库基础与实例教程之 视图触发器,1,2,3,本章首先讲解了视图以及触发器的管理及使用,然后结合“选课系统”分别介绍视图以及触发器在该系统中的应用。,4,触发器,视图,临时表,派生表(Derived Table),5,视图、子查询、临时表、派生表,内容一览,视图与表有很多相似的地方,视图也是由若干个字段以及若干条记录构成,视图也可以作为select语句的数据源。甚至在某些特定条件下,可以通过视图对表进行更新操作。,7.1 视图,1,2,3,视图中保存的仅仅是一条select语句,视图中的源数据都来自于数据库表,数据库表称为基本表或者基表,视图称为虚表。,查看视图的定义,创

2、建视图,视图在“选课系统”中的应用,4,5,视图的作用,删除视图,7.1 视图,6,7,视图中保存的仅仅是一条select语句,视图中的源数据都来自于数据库表,数据库表称为基本表或者基表,视图称为虚表。,检查视图,local与cascade检查视图,7.1 视图,创建视图的语法格式如下。 create view 视图名 (视图字段列表) as select语句,7.1.1 创建视图,任务布置1:上机操作,完成本书场景描述1的任务要求,理解“对于经常使用的、结构复杂的select语句,建议将其封装为视图 ” 。,7.1.1 创建视图,可以使用下面四种方法查看视图的定义。 1在choose数据库中

3、成功地创建了视图available_course_view后,该视图的定义默认保存在数据库目录(例如choose目录)下,文件名为available_course_view.frm。使用记事本打开该文件,即可查看该视图的定义。,7.1.2 查看视图的定义,可以使用下面四种方法查看视图的定义。 2视图是一个虚表,也可以使用查看表结构的方式查看视图的定义。 3MySQL命令“show tables;”命令不仅显示当前数据库中所有的基表,也会将所有的视图罗列出来。,7.1.2 查看视图的定义,可以使用下面四种方法查看视图的定义。 4MySQL系统数据库information_schema的views

4、表存储了所有视图的定义,使用下面的select语句查询该表的所有记录,也可以查看所有视图的详细信息。 select * from information_schema.viewsG,7.1.2 查看视图的定义,从现在开始,本书将选择“方案一”实现学生选课功能。方案一与方案二的唯一区别在于:方案一中的课程course表比方案二中的课程course表多了一个“剩余的学生名额”available字段。 任务布置2:上机操作,完成本书场景描述2的任务要求。,7.1.3 视图在“选课系统”中的应用,1使操作变得简单 2避免数据冗余 3增强数据安全性 4提高数据的逻辑独立性,7.1.4 视图的作用,如果某

5、个视图不再使用,可以使用drop view语句将该视图删除,语法格式如下。 drop view 视图名,7.1.5 删除视图,视图分为普通视图与检查视图。通过检查视图更新基表数据时,只有满足检查条件的更新语句才能成功执行。创建检查视图的语法格式如下。create view 视图名 (视图字段列表) as select语句 with local | cascaded check option,7.1.6 检查视图,任务布置3:上机操作,完成本书场景描述3:普通视图与更新操作的任务要求。 任务布置4:上机操作,完成本书场景描述4:检查视图与更新操作的任务要求。 然后分析普通视图与检查视图之间的区别

6、。,7.1.6 检查视图,检查视图分为local检查视图与cascade检查视图。 with_check_option的值为1时表示local(local视图), 值为2时表示cascade(级联视图,在视图的基础上再次创建另一个视图)。,7.1.6 local与cascade检查视图,local 检查视图与 cascade检查视图,7.1.6 local与cascade检查视图,1,2,3,触发器主要用于监视某个表的insert、update以及delete等更新操作,这些操作可以分别激活该表的insert、update或者delete类型的触发程序运行,从而实现数据的自动维护。,使用触发器

7、实现检查约束,准备工作,使用触发器维护冗余数据,4,5,使用触发器模拟外键级联选项,查看触发器的定义,7.2 触发器,6,7,触发器主要用于监视某个表的insert、update以及delete等更新操作,这些操作可以分别激活该表的insert、update或者delete类型的触发程序运行,从而实现数据的自动维护。,删除触发器,使用触发器的注意事项,7.2 触发器,7.2 触发器,使用create trigger语句可以创建一个触发器,语法格式如下。 create trigger 触发器名 触发时间 触发事件 on 表名 for each row begin 触发程序 end,7.2.1 准

8、备工作,MySQL的触发事件有三种:insert:将新记录插入表时激活触发程序,例如通过insert、load data和replace语句,可以激活触发程序运行。,7.2.1 准备工作,MySQL的触发事件有三种:update:更改某一行记录时激活触发程序,例如通过update语句,可以激活触发程序运行。delete:从表中删除某一行记录时激活触发程序,例如通过delete和replace语句,可以激活触发程序运行。,7.2.1 准备工作,触发器的触发时间有两种:before与after。before表示在触发事件发生之前执行触发程序。after表示在触发事件发生之后执行触发器。因此严格意义

9、上讲一个数据库表最多可以设置六种类型的触发器。,7.2.1 准备工作,for each row表示行级触发器。目前MySQL仅支持行级触发器,不支持语句级别的触发器(例如create table等语句)。for each row表示更新(insert、update或者delete)操作影响的每一条记录都会执行一次触发程序。,7.2.1 准备工作,触发程序中可以使用old关键字与new关键字。当向表插入新记录时,在触发程序中可以使用new关键字表示新记录,当需要访问新记录的某个字段值时,可以使用“new.字段名”的方式访问。,7.2.1 准备工作,触发程序中可以使用old关键字与new关键字。当

10、从表中删除某条旧记录时,在触发程序中可以使用old关键字表示旧记录,当需要访问旧记录的某个字段值时,可以使用“old.字段名”的方式访问。,7.2.1 准备工作,触发程序中可以使用old关键字与new关键字。当修改表的某条记录时,在触发程序中可以使用old关键字表示修改前的旧记录、使用new关键字表示修改后的新记录。当需要访问旧记录的某个字段值时,可以使用“old.字段名”的方式访问。当需要访问修改后的新记录的某个字段值时,可以使用“new.字段名”的方式访问。,7.2.1 准备工作,触发程序中可以使用old关键字与new关键字。old记录是只读的,可以引用它,但不能更改它。在before触发

11、程序中,可使用“set new.col_name = value”更改new记录的值。,7.2.1 准备工作,前面曾经提到,MySQL可以使用复合数据类型set或者enum对字段的取值范围进行检查约束,使用复合数据类型可以实现离散的字符串数据的检查约束,对于数值型的数不建议使用set或者enum实现检查约束,可以使用触发器实现。,7.2.2 使用触发器实现检查约束,任务布置5:上机操作,完成本书场景描述5:使用触发器实现检查约束的任务要求。,7.2.2 使用触发器实现检查约束,冗余的数据需要额外的维护,维护冗余数据时,为了避免数据不一致问题的发生(例如:剩余的学生名额+已选学生人数课程的人数上

12、限),冗余的数据应该尽量避免交由人工维护,建议冗余的数据交由应用系统(例如触发器)自动维护。,7.2.3 使用触发器维护冗余数据,任务布置6:上机操作,完成本书场景描述6:使用触发器自动维护课程available的字段值的任务要求。,7.2.3 使用触发器维护冗余数据,对于InnoDB存储引擎的表而言,由于支持外键约束,在定义外键约束时,通过设置外键的级联选项cascade、set null或者no action(restrict),外键约束关系可以交由InnoDB存储引擎自动维护。,7.2.4 使用触发器模拟外键级联选项,任务布置7:上机操作,完成本书场景描述7:使用InnoDB存储引擎维护

13、外键约束关系的任务要求。任务布置8:上机操作,完成本书场景描述8:使用触发器模拟外键级联选项的任务要求。,7.2.4 使用触发器模拟外键级联选项,可以使用下面四种方法查看触发器的定义。1使用show triggers命令查看触发器的定义,7.2.5 查看触发器的定义,可以使用下面四种方法查看触发器的定义。2查询information_schema数据库中的triggers表,可以查看触发器的定义 MySQL中所有触发器的定义都存放在information_schema数据库下的triggers表中,查询triggers表,可以查看所有数据库中所有触发器的详细信息,查询语句如下: select

14、* from information_schema.triggersG,7.2.5 查看触发器的定义,可以使用下面四种方法查看触发器的定义。3使用“show create trigger”命令可以查看某一个触发器的定义。 例如使用“show create trigger organization_delete_before_triggerG”命令可以查看触发器organization_delete_before_trigger的定义。,7.2.5 查看触发器的定义,可以使用下面四种方法查看触发器的定义。4成功创建触发器后,MySQL自动在数据库目录下创建TRN以及TRG触发器文件,以记事本方式

15、打开这些文件,可以查看触发器的定义。,7.2.5 查看触发器的定义,可以使用drop trigger语句将该触发器删除,语法格式如下。drop trigger 触发器名,7.2.6 删除触发器,1触发程序中如果包含select语句,该select语句不能返回结果集。 2同一个表不能创建两个相同触发时间、触发事件的触发程序。 3触发程序中不能使用以显式或隐式方式打开、开始或结束事务的语句,如start transaction、commit、rollback或者set autocommit=0等语句。,7.2.7 使用触发器的10条注意事项,4MySQL触发器针对记录进行操作,当批量更新数据时,引

16、入触发器会导致更新操作性能降低。 5在MyISAM存储引擎中,触发器不能保证原子性。InnoDB存储引擎支持事务,使用触发器可以保证更新操作与触发程序的原子性,此时触发程序和更新操作是在同一个事务中完成。,7.2.7 使用触发器的10条注意事项,6InnoDB存储引擎实现外键约束关系时,建议使用级联选项维护外键数据;MyISAM存储引擎虽然不支持外键约束关系时,但可以使用触发器实现级联修改和级联删除,进而维护“外键”数据,模拟实现外键约束关系。,7.2.7 使用触发器的10条注意事项,7使用触发器维护InnoDB外键约束的级联选项时,数据库开发人员究竟应该选择after触发器还是before触

17、发器?答案是:应该首先维护子表的数据,然后再维护父表的数据,否则可能出现错误。,7.2.7 使用触发器的10条注意事项,8MySQL的触发程序不能对本表进行更新语句(例如update语句)。触发程序中的更新操作可以直接使用set命令替代,否则可能出现错误信息,甚至陷入死循环。 9在before触发程序中,auto_increment字段的new值为0,不是实际插入新记录时自动生成的自增型字段值。,7.2.7 使用触发器的10条注意事项,10添加触发器后,建议对其进行详细的测试,测试通过后再决定是否使用触发器。,7.2.7 使用触发器的10条注意事项,1,2,3,按照MySQL临时表的存储位置可

18、以将其分为内存临时表(in-memory)以及外存临时表(on-disk)。 按照MySQL临时表的创建时机可以将其分为自动创建的临时表以及手动创建的临时表。,“选课系统”中临时表的使用,临时表的创建、查看与删除,使用临时表的注意事项,7.3 临时表,1手动创建临时表 手动创建临时表很容易,给正常的create table语句加上temporary关键字即可。 2查看临时表的定义可以使用MySQL语句“show create table 临时表名;”。,7.3.1 临时表的创建、查看与删除,3断开MySQL服务器的连接,临时表frm表结构定义文件以及表记录将被清除。使用drop命令也可以删除临

19、时表,语法格式如下。 drop temporary table 临时表表名,7.3.1 临时表的创建、查看与删除,任务布置9:上机操作,完成本书场景描述9的任务要求。,7.3.2 “选课系统”中临时表的使用,使用存储程序可以实现表数据的复杂加工处理,有时需要将select语句的查询结果集临时地保存到存储程序(例如函数、存储过程)的变量中,不过目前MySQL并不支持表类型变量。临时表可以模拟实现表类型变量的功能。,7.3.2 使用临时表的注意事项,临时表如果与基表重名,那么基表将被隐藏,除非删除临时表,基表才能被访问。Memory、MyISAM、Merge或者InnoDB存储引擎的表都支持临时表

20、。临时表不支持聚簇索引、触发器。,7.3.2 使用临时表的注意事项,show tables 命令不会显示临时表的信息。不能用rename来重命名一个临时表。但可以使用alter table重命名临时表。在同一条select语句中,临时表只能引用一次。例如下面的select语句将抛出“ERROR 1137 (HY000): Cant reopen table: t1”错误信息。select * from temp as t1, temp as t2;,7.3.2 使用临时表的注意事项,派生表与视图一样,一般在from子句中使用,其语法格式如下(粗体字代码为派生表代码)。.from (select

21、子句) 派生表名.派生表必须是一个有效的表,因此它必须遵守以下规则: 每个派生表必须有自己的别名。 派生表中的所有字段必须要有名称,字段名必须唯一。,7.4 派生表(Derived Table),任务布置10:完成本书场景描述10的任务要求。,7.4 派生表(Derived Table),子查询一般在主查询语句中的where子句或者having子句中使用。 视图通常在主查询语句中的from子句中使用。,7.5 子查询、视图、临时表、派生表,视图本质是一条select语句,执行的是某一个数据源某个字段的查询操作,如果视图的“主查询”语句是update语句、delete语句或者insert语句,且

22、“主查询”语句执行了该数据源该字段的更新操作,那么主查询语句将出错。原因非常简单:在对某个表的某个字段操作时,查询操作(select语句)不能与更新操作(update语句、delete语句或者insert语句)同时进行。,7.5 子查询、视图、临时表、派生表,与视图相似,临时表一般在from子句中使用。临时表与视图的区别在于:临时表本质也是一条select语句,执行的是某一个数据源某个字段的查询操作,但由于临时表会先执行完毕,并且将查询结果集提前置放到服务器内存。因此“临时表”的“主查询”语句(例如update、delete或者insert语句)执行字段的更新操作时,不会产生“ERROR 1443 (HY000)”错误。,7.5 子查询、视图、临时表、派生表,派生表与临时表的功能基本相同,它们之间的最大区别在于生命周期不同。临时表如果是手工创建,那么临时表的生命周期在MySQL服务器连接过程中有效;而派生表的生命周期仅在本次select语句执行的过程中有效,本次select语句执行结束,派生表立即清除。因此,如果希望延长查询结果集的生命周期,可以选用临时表;反之亦然。,7.5 子查询、视图、临时表、派生表,另外,通过视图虽然可以更新基表的数据,但本书并不建议这样做。原因在于:通过视图更新基表数据,并不会触发触发器的运行。,7.5 子查询、视图、临时表、派生表,Thanks,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报