文章为作者原创,未经许可,禁止转载。    -Sun Yat-sen University 冯兴伟

实验4 触发器

(1)实验目的

掌握数据库触发器的设计和使用方法

(2)实验内容和要求

定义BEFORE触发器和AFTER触发器。能够理解不同类型触发器的作用和执行原理,验证触发器的有效性。

(3)实验重点和难点

实验重点:触发器的定义。

实验难点:利用触发器实现较为复杂的用户自定义完整性。

此次实验还是延用理论课本中出现的大学数据库作为实验例子。

(1).    AFTER触发器

i.  在takes表上定义一个UPDATE触发器,当takes表中元组的属性grade被更新时,意味着学生上的这么课的课程成绩被更新,需要用触发器维护student里元组的tot_cred属性,使其获得的总学分保持实时更新。只有当属性grade从空值或者’F’被更新为代表课程已经完成的具体分数时,触发器才会被激发。

delimiter
create trigger credit_get after update
on takes for each row
begin
    if (NEW.grade <> 'F' and NEW.grade is not null
              and (OLD.grade = 'F' or OLD.grade is null))
       then
    update student
    set tot_cred = tot_cred +
              (select credits
        from course
        where course.course_id = NEW.course_id)
        where student.ID = NEW.ID;
 end if;
 end;

ii.  在section表上定义一个INSERT触发器,当对课程section表执行任何插入操作后触发器被启动,以确保插入元组的time_slot_id属性即上课时间段是合法的,受time_slot表的time_slot_id约束,检查插入时的参照完整性。

delimiter
create trigger timeslot_check1 after insert
on section for each row
begin
       if(NEW.time_slot_id not in
              (select time_slot_id
         from time_slot))
       then
       delete from section
    where time_slot_id = NEW.time_slot_id;
end if;
end

iii.  在time_slot表上定义一个DELETE触发器,当删除的元组的time_slot_id不在删除后的time_slot表中时,且section中存在包含这个time_slot_id 值的元组时,触发器被启动,以确保time_slot中发生删除时,section的参照完整性。

delimiter
create trigger timeslot_check2 after delete
on time_slot for each row
begin
       if(OLD.time_slot_id not in
              (select time_slot_id
         from time_slot)
         and OLD.time_slot_id in
              (select time_slot_id
         from section))
       then
       insert into time_slot
              values(OLD);
end if;
end

iv.   验证定义在takes表上的AFTER UPDATE触发器

初始时编号999的学生在493这门课成绩为F,即不通过,无法获得学分:

且其已获学分为15:

假设补考过后其成绩为B,需更新takes:

定义在takes表上的UPDATE触发器触发,此时学生的总学分应该增加:

从上图可以看到UPDATE触发器触发成功。

(2).    BEFORE触发器

Before触发器的update,insert,delete语句语法和after触发器基本类似,故此下面不再赘述全部三种语句,只拿BEFORE INSERT触发器做为例子。

i.                     在takes表上定义一个before insert触发器,插入一条记录时,假设所插入的分数的

值为空白则表明该分数发生缺失,所以定义此触发器在分数值条件满足时触发用null值代替空白。

delimiter
create trigger setnull before insert
on takes for each row
begin
       if(NEW.grade = ' ')
    then
    set NEW.grade = null;
end if;
end

ii.  验证定义在takes表上的BEFORE INSERT触发器

初始时:

编号为999的学生只有一门课

假设该学生现在上了另一门课,插入元组,且该课程成绩缺失还没给出:

查看该学生所上课程的信息:

从上表可以看出takes表上的BEFORE INSERT触发器触发成功。

iii.  删除触发器

drop trigger setnull;

总结:

after触发器—是在记录操纵之后触发,是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作
before触发器—是在记录操纵之前触发,是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作,如:我们在触发之前需要判断new值和old值的大小或关系,如果满足要求就触发,不通过就修改再触发;如:表之间定义的有外键,在删除主键时,必须要先删除外键表,这时就有先后之分,这里before相当于设置了断点,我们可以处理删除外键。

对于INSERT语句, 只有NEW是合法的;

对于DELETE语句,只有OLD才合法;

对于UPDATE语句,NEW、OLD可以同时使用。

MySQL触发器-条件触发器语法的更多相关文章

  1. mysql:视图,触发器,事务,存储过程,函数

    一.视图 视图是一个虚拟表并不是(正实存在的) 创建老师表 create table teacher( id int primary key auto_increment, tname varchar ...

  2. MySQL数据库之触发器

    1 引言 本文是对MySQL中触发器的总结,从触发器概念出发,结合实例对创建触发器.使用触发器.删除触发器进行介绍. 2 触发器简介 MySQL触发器和存储过程一样,都是嵌入到MySQL的一段程序.触 ...

  3. mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

    mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...

  4. mysql:视图、触发器、事务、存储、函数、流程控制

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...

  5. mysql 视图,触发器,存储

    一.视图 概念:其实就是一个临时表. 视图是一个虚拟表(非真实存在的),其本质是[根据SQL语句获取动态的数据库,并为其命名],用户使用时只需使用[名称]即可获取结果集.就可以当做表来使用. # 1. ...

  6. mysql 视图、触发器、事物、存储过程、函数

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  7. MySQL优化之——触发器

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46763665 触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触 ...

  8. Mysql数据库的触发器、存储引擎和存储过程

    数据库的触发器 1.触发器 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句): DELETE,INSERT,UPDATE 我们可以监视某表 ...

  9. MySQL视图、触发器、事务、存储过程、函数

    视图.触发器.事务.存储过程.函数   阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据 ...

随机推荐

  1. 关于开启.NET在线提升教育培训的通知! - 可在此页面观看在线直播!

    年前在线公开课程通知: 近期在开启VIP课程,隔天讲一次,年前其它时间插空讲公开课,主题:设计模式系列 1:培训 - 大概不会讲的内容: 1:不讲系列. 2:不讲入门. 3:不讲我不懂的! 2:培训 ...

  2. [OpenGL超级宝典]专栏前言

    我小时候的梦想呢,是做宇航员或者科学家或者是做一款属于自己的游戏,后来前面两个梦想都没有实现,于是我就来实现我的第三个梦想了,,,我呢,也算是零基础,因为我的专业是物联网工程,这个专业覆盖面之广,简直 ...

  3. mybatis_基础篇

    一.认识mybatis: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...

  4. C#创建dll类库

    类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...

  5. Velocity初探小结--Velocity在spring中的配置和使用

    最近正在做的项目前端使用了Velocity进行View层的数据渲染,之前没有接触过,草草过了一遍,就上手开始写,现在又回头细致的看了一遍,做个笔记. velocity是一种基于java的模板引擎技术, ...

  6. C#日志

    参考页面: http://www.yuanjiaocheng.net/Entity/first.html http://www.yuanjiaocheng.net/Entity/jieshao.htm ...

  7. JDBC简介

    jdbc连接数据库的四个对象 DriverManager  驱动类   DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 ...

  8. GOF23设计模式归类

    创建型模式:-单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式结构型模式:-适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式行为型模式:-模板方法模式.命令模式.迭代器模式 ...

  9. 热修复-Tinker

    微信开源,真是喜出望外,必须要去看看啊,比起nuwa来微信好很多,而且github上也有专门的官方文档说明,还有很多资料查询 参考地址:https://github.com/Tencent/tinke ...

  10. 安卓GreenDao框架一些进阶用法整理

    大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...