实验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 触发器 trigger用法 four的更多相关文章

  1. mysql 触发器 trigger用法 two (稍微复杂的)

    触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...

  2. mysql 触发器 trigger用法 three (稍微复杂的)

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...

  3. mysql 触发器 trigger用法 one (简单的)

    实例~~ example1: 创建表tab1 1 2 3 4 DROP TABLE IF EXISTS tab1; CREATE TABLE tab1(     tab1_id varchar(11) ...

  4. mysql触发器trigger 实例详解

    mysql触发器trigger 实例详解 (转自 https://www.cnblogs.com/phpper/p/7587031.html)   MySQL好像从5.0.2版本就开始支持触发器的功能 ...

  5. 如何使用MySQL触发器trigger

    阅读目录:触发器trigger的使用 创建触发器 单一执行语句.多执行语句 new.old详解 查看触发器 删除触发器:慎用触发器,不用就删除 Q:什么是触发器? A: 触发器是与表有关的数据库对象, ...

  6. mysql 触发器(trigger)

    触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...

  7. MySQL触发器Trigger实例篇

    定义: 何为MySQL触发器? 在MySQL Server里面也就是对某一个表的一定的操作,触发某种条件(Insert,Update,Delete 等),从而自动执行的一段程序.从这种意义上讲触发器是 ...

  8. MySQL触发器 trigger学习

    触发器:一类特殊的事物.可监视某种数据操作,并触发相关操作(insert/update/delete).表中的某些数据改变,希望同一时候能够引起其他相关数据改变的需求. 作用:变化自己主动完毕某些语句 ...

  9. MySQL 触发器trigger

    一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(af ...

随机推荐

  1. SqlServer数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述) Value ) AS value FROM sysobjects a Where a.xtype = 'U' AND a.name <> 'sysdiagram ...

  2. linux Service start

    1. crontab的方式 2. 服务的方式.该服务能够持续监测minerd是否在运行,如果没有在运行就会运行minerd:服务也可以做成开机自启动.该服务执行的内容如下,该服务是判断目标服务器的pa ...

  3. Making the Grade---poj3666(dp)

    题目链接:http://poj.org/problem?id=3666 题意:有一个n个数的序列a,现在要把这些序列变成单调增的或者单调减的序列 b , 其价值为|A1 - B1| + |A2 - B ...

  4. OA系统部署短信过程

    安装dotNetFx40_Client_setup.exe插件 安装mysql_installer_community_V5.6.21.1_setup.1415604646.msi数据库 根据数据库版 ...

  5. HTML状态消息

    HTTP 状态消息 当浏览器从 web 服务器请求服务时,可能会发生错误. 以下列举了有可能会返回的一系列 HTTP 状态消息: 1xx: 信息 消息: 描述: 100 Continue 服务器仅接收 ...

  6. 在centos7下安装svn

    SVN的安装 yum install subversion 服务端命令 1. svnserver - 控制svn系统服务的启动等 2. svnadmin - 版本库的创建/导出/导入/删除等 3. s ...

  7. 详解Linux(centos7)下安装OpenSSL安装图文方法

    OpenSSL是一个开源的ssl技术,由于我需要使用php相关功能,需要获取https的文件所以必须安装这个东西了,下面我整理了两种关于OpenSSL安装配置方法. 安装环境:  操作系统:CentO ...

  8. POJ1789:Truck History(Prim算法)

    http://poj.org/problem?id=1789 Description Advanced Cargo Movement, Ltd. uses trucks of different ty ...

  9. javascript unicode与GBK2312(中文)编码转换示例

    一个javascript的unicode与GBK2312编码相互转换的方法. 代码: var GB2312UnicodeConverter = {     ToUnicode: function (s ...

  10. iOS开发--UILabel根据内容自动调整高度

    写法一:对象方法,传入:字体/最大尺寸. 即可得到宽高, 最大尺寸主要限制宽度,如果是一行就给个{MAXFLOAT,MAXFLOAT};如果是多行就限制X值,Y值随便给 - (CGSize)sizeW ...