我是靠谱客的博主 矮小河马,最近开发中收集的这篇文章主要介绍标准SQL和MYSQL触发器的差异一、触发器的定义二、 保存临时变量的容器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

        触发器 (trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。在定义触发器后一旦进行增、删、改操作时都会由服务器自动激活相应的触发器。简单来说触发器就是和JAVA中的监听器功能相似。

一、触发器的定义

        在上课过程中,很多老师只讲了标准SQL语句中的触发器,许多课本也仅仅提供了标准SQL语句下触发器的定义,而触发器在SQL99才写入SQL标准,MYSQL在此之前已经支持触发器,所以其有一套自己的触发器语法。

         标准SQL下触发器的定义

CREATE TRIGGER  <触发器名> 

{ BEFORE | AFTER } <触发事件> ON <表名> 

FOR EACH { ROW | STATEMENT }

[ WHEN <触发条件> ]

<触发动作体>


1.触发器名:即为触发器的名称

2.触发事件:INSERT/DELETE/UPDATE及这些操作的组合

3.表名:触发器的目标表

4.触发条件:只有触发条件为真,才执行动作体

5.触发动作体:即要执行的功能


BRFORE|AFTER 即在完成事件之前还是之后激活触发器。

FOR EACH ROW|STATEMENT 定义触发器类型为行级(ROW)还是语句级(STATEMENT)

行级触发器则只要修改某一行,即会激活触发器。

语句级触发器则只有一条SQL语句执行完毕才会激活触发器。

        MYSQL下触发器的定义 

CREATE TRIGGER  <触发器名> 

{ BEFORE | AFTER } <触发事件> ON <表名> 

FOR EACH ROW

[ WHEN <触发条件> ]

<触发动作体>


MYSQL下触发器的定义取消了触发器的类型,使得所有触发器都只能为行级触发器。

二、 保存临时变量的容器

        在很多教科书中,这一部分都统称为临时表。存放的是对表中修改行的信息,触发器自动创建自动删除。
        标准SQL下临时表

INSERTEDDELETED
INSERT×
DELETE×
UPDATE

举个例子

在STUDENT表中定义一个触发器,使得当该学生为计算机系学生时将该学生信息自动写入CS_STUDENT表

CREATE TRIGGER InsertStudentTrigger
AFTER insert ON student
FOR EACH STATEMENT 
AS BEGIN
 Insert into CS_Student
 Select * from inserted where sdept = ‘CS’;
END;

INSERT INTO STUDENT(SNO,SNAME,DEPTNAME)
VALUES('202002','张三','CS');

执行过程如下:

起始状态的STUDENT,CS_STUSENT表

STUDENT
SNOSNAMEDEPTNAME
202001李四IS

执行上述插入语句时,先影响STUDENT表

STUDENT
SNOSNAMEDEPTNAME
202001李四IS
202002张三CS

激活触发器,系统自动生成一个INSERTED表

INSERTED
SNOSNAMEDEPTNAME
202002张三CS

之后将INSERTED表中数据放入CS_STUDENT表中

CS_STUDENT
SNOSNAMEDEPTNAME
202002张三CS

系统自动删除INSERTED表。

         MYSQL下的临时数据存放器

        在MYSQL中,由于触发器只有行级类型触发器,如果把其看作一张表,则是一张只有一行数据的表格,所以MYSQL中取消了临时数据表,改成了一个类似JAVA中保存临时数据的对象。名字为NEW和OLD,因为他们不是表,故无法在SELECT语句中引用。

还是刚才那个例子

CREATE TRIGGER InsertStudentTrigger
AFTER insert ON student
FOR EACH ROW
 Insert into CS_Student
 Select * from NEW where sdept = ‘CS’;

INSERT INTO STUDENT(SNO,SNAME,DEPTNAME)
VALUES('202002','张三','CS');

执行后会报不存在NEW表的异常,正确的方法如下:

CREATE TRIGGER CSP
BEFORE INSERT ON STUDENT
FOR EACH ROW
BEGIN
	IF NEW.DEPTNAME = 'CS'
	THEN INSERT INTO STUDENTCS
				VALUES(NEW.SNO,NEW.SNAME,NEW.DEPTNAME);
	END IF;
END;

INSERT INTO STUDENT(SNO,SNAME,DEPTNAME)
VALUES('202002','张三','CS');

执行过程是这样的:

执行上述插入语句时,先影响STUDENT表

STUDENT
SNOSNAMEDEPTNAME
202001李四IS
202002张三CS

激活触发器,系统自动生成一个NEW对象(拿JAVA中的类举例)

class NEW{

        SNO = '202002';

        SNAME = '张三';

        DEPTNAME = 'CS';

}

把这个对象中的数据插入CS_STUDENT表中

CS_STUDENT
SNOSNAMEDEPTNAME
202002张三CS

删除生成的NEW对象。

最后

以上就是矮小河马为你收集整理的标准SQL和MYSQL触发器的差异一、触发器的定义二、 保存临时变量的容器的全部内容,希望文章能够帮你解决标准SQL和MYSQL触发器的差异一、触发器的定义二、 保存临时变量的容器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部