概述
触发器 (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下临时表
INSERTED | DELETED | |
---|---|---|
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表
SNO | SNAME | DEPTNAME |
---|---|---|
202001 | 李四 | IS |
执行上述插入语句时,先影响STUDENT表
SNO | SNAME | DEPTNAME |
---|---|---|
202001 | 李四 | IS |
202002 | 张三 | CS |
激活触发器,系统自动生成一个INSERTED表
SNO | SNAME | DEPTNAME |
---|---|---|
202002 | 张三 | CS |
之后将INSERTED表中数据放入CS_STUDENT表中
SNO | SNAME | DEPTNAME |
---|---|---|
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表
SNO | SNAME | DEPTNAME |
---|---|---|
202001 | 李四 | IS |
202002 | 张三 | CS |
激活触发器,系统自动生成一个NEW对象(拿JAVA中的类举例)
class NEW{
SNO = '202002';
SNAME = '张三';
DEPTNAME = 'CS';
}
把这个对象中的数据插入CS_STUDENT表中
SNO | SNAME | DEPTNAME |
---|---|---|
202002 | 张三 | CS |
删除生成的NEW对象。
最后
以上就是矮小河马为你收集整理的标准SQL和MYSQL触发器的差异一、触发器的定义二、 保存临时变量的容器的全部内容,希望文章能够帮你解决标准SQL和MYSQL触发器的差异一、触发器的定义二、 保存临时变量的容器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复