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

实验4触发器

(1)实验目的

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

(2)实验内容和要求

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

(3)实验重点和难点

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

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

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

(1).AFTER触发器

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

delimitercreate trigger credit_get after update

on takes foreach rowbeginif (NEW.grade <> ‘F‘ and NEW.grade is not nulland (OLD.grade = ‘F‘ or OLD.grade is null))thenupdatestudentset tot_cred = tot_cred +(selectcreditsfromcoursewhere 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约束,检查插入时的参照完整性。

delimitercreate trigger timeslot_check1 after insert

on section foreach rowbeginif(NEW.time_slot_id not in(selecttime_slot_idfromtime_slot))thendelete fromsectionwhere 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的参照完整性。

delimitercreate trigger timeslot_check2 after delete

on time_slot foreach rowbeginif(OLD.time_slot_id not in(selecttime_slot_idfromtime_slot)and OLD.time_slot_id in(selecttime_slot_idfromsection))theninsert intotime_slotvalues(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值代替空白。

delimitercreate trigger setnull before insert

on takes foreach rowbeginif(NEW.grade = ‘ ‘)thenset 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可以同时使用。

原文:http://www.cnblogs.com/fengxw/p/6076150.html

mysql触发器新元组_MySQL触发器-条件触发器语法相关推荐

  1. mysql 触发器定义变量_MySQL 函数存储过程触发器定义简单示例

    1.变量提示 NEW 是新值-- OLD 是旧值 INSERT 只有NEW ----UPDATE有NEW和OLD ---DELETE只有OLD 2.准备测试表(userinfo.userinfolog ...

  2. mysql 触发器 库存管理_Mysql中的触发器(库存、用户订单中用到)

    什么是触发器? 触发器是数据库的一个程序,他是用来监听着数据表的某个行为,一旦数据表的这个行为发生了,马上执行相应的sql语句 触发器的语法结构: create trigger触发器的名称触发器事件o ...

  3. mysql 自定义函数 事务_MySQL存储过程、触发器、自定义函数、事务

    1.存储过程 MySQL中存储过程的参数中有IN.OUT.INOUT类型,但是函数的参数只能是IN类型的. "in" 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过 ...

  4. mysql采用 级触发_Mysql高级之触发器(trigger)

    触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete). 看以下事件: 完成下单与减少库存的逻辑 Ins ...

  5. mysql or全表_mysql or条件可以使用索引而避免全表

    在某些情况下,or条件可以避免全表扫描的. 1 .where 语句里面如果带有or条件, myisam表能用到索引, innodb不行. 1)myisam表: CREATE TABLE IF NOT ...

  6. mysql where非常规用法_MySQL where 条件的这个坑你碰到过没

    导读: 本文节选自松华老师的<SQL优化专栏> 郑松华,知数堂SQL 优化班老师 现任 CCmediaService DBA,主要负责数据库优化相关工作 擅长SQL优化 ,数据核对 想内容 ...

  7. mysql触发器如果提示_mysql 触发器

    1   引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...

  8. mysql创建删除触发器的时候_mysql触发器简介及如何创建和删除触发器

    什么是mysql触发器 需要MySQL 5 对触发器的支持是在MySQL 5中增加的.因此,本章内容适用于MySQL 5或之后的版本. MySQL语句在需要时被执行,存储过程也是如此.但是,如果你想要 ...

  9. mysql库表的触发器表名_MySQL 触发器,实现不同数据库,不同表名,表结构不同,数据实时同步...

    创建触发器: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ...

最新文章

  1. sap服务器应用webservice加载spring的机制问题
  2. docker环境下指定jvm参数
  3. LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
  4. 算数运算加法_为什么计算机能“算数”
  5. javabean反射改字段内容_java反射机制给实体类相同字段自动赋值实例
  6. C++11 std::function, std::bind, std::ref, std::cref
  7. Redis内存缓存系统入门
  8. 数据库设计:范式与反范式
  9. 实时查看MD文件效果 - 在线Markdown预览
  10. Qt5.3.1环境变量配置-----gyy
  11. 一个新手对软件开发的理解(写自第一个项目--Linpop之后)
  12. python中if缩进规则_Python缩进与if语句 空格的魅力
  13. C++标准库笔记-多线程-shared_future-future的补充扩展
  14. 面向5G的阿里自研标准化协议库XQUIC
  15. 搭建本地oracle数据库
  16. python模拟淘宝登陆_【Python】selenium模拟淘宝登录
  17. idea 配置idk
  18. laravel vue使用
  19. 坚果手机刷linux,3/3T刷入Pt锤子SmartisanOS6的正确方法,解决3T区错误教程的问题...
  20. 虚拟技术应用——网络虚拟商城系统

热门文章

  1. 优秀的人,都敢对自己下狠手
  2. 能源利用率逼近理论极限 阿里巴巴展示液冷黑科技
  3. Activiti工作流引擎使用
  4. AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔)
  5. 为什么有时候 php 没有写闭合标签结束符?
  6. 【WPF】提高InkAnalyer手写汉字识别的准确率
  7. Docbook之一:概念 DOM schema xsl xsl-xslt xsl-fo
  8. android 根据时间获取周几_android 调用系统 calendars 如何获取一个指定日期的所有日程 event。...
  9. php默认访问的文件,PHP 网站修改默认访问文件的nginx配置
  10. Nacos配置的优先级