MySQL的触发器是MySQL5版本新增的功能。其实它的理论和Oracle的触发器差不多,只是在语法上有那么点不同啦。如果有Oracle的编程基础,我想MySQL的触发器你就会很轻松、愉悦地装进自己的脑子了。
触发器的实现就是对于数据库的添加、删除和修改所引起的关联操作。注意这些操作只适用于MySQL5以上的版本,低于这个版本不支持MySQL的触发器编码。
一、创建触发器的语法
-- 蓝色字体是关键字
create trigger trigger_name trigger_time trigger_event on table_name
for each row trigger_stmt
--》 trigger_name 代表触发器的名字,可自己定义
--》 trigger_time 标识触发时机,用before或者after替换
--》 trigger_event 标识触发的事件,用insert、update和delete替换
--》 table_name 给指定的表添加触发事件
--》 trigger_stmt 是触发器的程序体,其用begin开始,end结束,中间可以写一些逻辑代码
-- 下面有一个示例:
CREATE TRIGGER trig_useracct_update
AFTER UPDATE ON SF_User.useracct FOR EACH ROWBEGIN
IF OLD.ulevelid = 10101 OR OLD.ulevelid = 10104 THEN
IF NEW.ulevelid = 10101 OR NEW.ulevelid = 10104 THEN
if NEW.ustatid != OLD.ustatid OR NEW.exbudget != OLD.exbudget THEN
INSERT into FC_Output.fcevent set type = 2, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
end if;
ELSE
INSERT into FC_Output.fcevent set type = 1, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
END IF;
END IF;
END;
上述触发器实例使用了OLD关键字和NEW关键字。OLD和NEW可以引用触发器所在表的某一列,在上述实例中,OLD.ulevelid表示表 SF_User.useracct修改之前ulevelid列的值,NEW.ulevelid表示表SF_User.useracct修改之后 ulevelid列的值。另外,如果是insert型触发器,NEW.ulevelid也表示表SF_User.useracct新增行的 ulevelid列值;如果是delete型触发器OLD.ulevelid也表示表SF_User.useracct删除行的ulevelid列原值。
另外,OLD列是只读的,NEW列则可以在触发器程序中再次赋值。
二、 触发器基本语法
1.show triggers form SF_User like ‘user%’;// 查看SF_User库上名称和user%匹配的触发器
select * from information_schema.triggers where trigger_name='tri_name';//可以查询自己指定的触发器
2.show triggers;//查看所有触发器
3.对于比较多的触发器无法显示,可以采用MySQL中information_schema.triggers,
存储所有库中的所有触发器,desc information_schema. TRIGGERS
4.drop trigger 触发器名字; //删除触发器
三、Msyql触发器的trigger_time和trigger_event
现在,重新注意到trigger_time和trigger_event,上文说过, trigger_time可以用before和after替换,表示触发器程序的执行在sql执行的前还是后;trigger_event可以用 insert,update,delete替换,表示触发器程序在什么类型的sql下会被触发。
在一个表上最多建立6个触发器,即1)before insert型,2)before update型,3)before delete型,4)after insert型,5)after update型,6)after delete型。
触发器的一个限制是不能同时在一个表上建立2个相同类型的触发器。这个限制的一个来源是触发器程序体的“begin和end之间允许运行多个语句”(摘自mysql使用手册)。
另外还有一点需要注意,msyql除了对insert,update,delete基本操作进行定义外,还定义了load data和replace语句,而load data和replace语句也能引起上述6中类型的触发器的触发。
Load data语句用于将一个文件装入到一个数据表中,相当与一系列insert操作。replace语句一般来说和insert语句很像,只是在表中有 primary key和unique索引时,如果插入的数据和原来primary key和unique索引一致时,会先删除原来的数据,然后增加一条新数据;也就是说,一条replace sql有时候等价于一条insert sql,有时候等价于一条delete sql加上一条insert sql。即是:
* Insert型触发器:可能通过insert语句,load data语句,replace语句触发;
* Update型触发器:可能通过update语句触发;
* Delete型触发器:可能通过delete语句,replace语句触发;
在一个表上最多建立6个触发器,即1)before insert型,2)before update型,3)before delete型,4)after insert型,5)after update型,6)after delete型。
触发器的一个限制是不能同时在一个表上建立2个相同类型的触发器。这个限制的一个来源是触发器程序体的“begin和end之间允许运行多个语句”(摘自mysql使用手册)。
另外还有一点需要注意,msyql除了对insert,update,delete基本操作进行定义外,还定义了load data和replace语句,而load data和replace语句也能引起上述6中类型的触发器的触发。
Load data语句用于将一个文件装入到一个数据表中,相当与一系列insert操作。replace语句一般来说和insert语句很像,只是在表中有 primary key和unique索引时,如果插入的数据和原来primary key和unique索引一致时,会先删除原来的数据,然后增加一条新数据;也就是说,一条replace sql有时候等价于一条insert sql,有时候等价于一条delete sql加上一条insert sql。即是:
* Insert型触发器:可能通过insert语句,load data语句,replace语句触发;
* Update型触发器:可能通过update语句触发;
* Delete型触发器:可能通过delete语句,replace语句触发;
四、MySQL触发器执行顺序
关于MySQL触发器的几个问题?
1.如果在before类型的触发器执行失败,sql语句会执行成功吗?
下面来做个测试: