文章为作者原创,未经许可,禁止转载。    -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. C# 文章导航

    1. C#相关文章 1.1 C# 基础(一) 访问修饰符.ref与out.标志枚举等等 1.2 C# 基础(二) 类与接口 1.3 C# DateTime日期格式化 1.4 C# DateTime与时 ...

  2. 2015 西雅图微软总部MVP峰会记录

    2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...

  3. .NET 对接JAVA 使用Modulus,Exponent RSA 加密

    最近有一个工作是需要把数据用RSA发送给Java 虽然一开始标准公钥 net和Java  RSA填充的一些算法不一样 但是后来这个坑也补的差不多了 具体可以参考 http://www.cnblogs. ...

  4. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  5. ExtJS 4.2 组件介绍

    目录 1. 介绍 1.1 说明 1.2 组件分类 1.3 组件名称 1.4 组件结构 2. 组件的创建方式 2.1 Ext.create()创建 2.2 xtype创建 1. 介绍 1.1 说明 Ex ...

  6. System.Guid ToString五中格式

    参考:https://msdn.microsoft.com/en-us/library/97af8hh4.aspx 测试代码: using System; using System.Collectio ...

  7. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  8. BPM配置故事之案例4-子表

    公司渐渐对采购管理重视起来了,新招聘了采购主管老李,老李对现有的申请表很不满意,要求将申请物资和申请原因改成物资明细表 物资明细表 小明只好继续致电大毛-- 大毛:把申请物资和申请原因删掉,新增一个数 ...

  9. Android中的多线程断点下载

    首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...

  10. Outfit7 庆祝其开发工作大获丰收

    走不寻常路之经验总结 每位合格应用开发人员都拥有相同的目标:灵机一动,构建独创性原型,克服各种困难,最终吸引投资者将其想法推向市场. 名声.财富以及构建更多应用的机会将接踵而至. 焦虑.改善和重复是开 ...