Mysql触发器

长时间没有用sql了 。平常也就用用一些简单的查询语句 。

 今天同事问我 。mysql有没有方法在插入一张表的时候去影响列一张表。楞了一下,随后回想起来,有这么个功能。但完全忘记是这怎么用的了 。

百度之整理一下。以备下次查阅

创建触发器。创建触发器语法如下:

 

Mysql触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW
begin
 sql code;
end;

其中
trigger_name 标识触发器名称,用户自行指定; trigger_time 标识触发时机,(before|after替); trigger_event 标识触发事件,(insert|update|delete) tbl_name 标识建立触发器的表名,即在哪张表上建立触发器; sql code 是触发器程序体;触发器程序可以使用begin和end作为开始和结束,中间包含多条语句; 下面给出trig_useracct_update一个触发器实例:
CREATE /*!50017 DEFINER = ‘root‘@‘localhost‘ */ TRIGGER trig_useracct_update AFTER UPDATEON SF_User.useracct FOR EACH ROW BEGIN 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;
Mysql触发器

上述触发器实例使用了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列则可以在触发器程序中再次赋值。

上述实例也使用了IF,THEN ,ELSE,END IF等关键字。在触发器程序体中,在beigin和end之间,可以使用顺序,判断,循环等语句,实现一般程序需要的逻辑功能。

查看触发器。查看触发器语法如下,如果知道触发器所在数据库,以及触发器名称等具体信息:

1 SHOW TRIGGERS from SF_User like "usermaps%"; //查看SF_User库上名称和usermaps%匹配的触发器

如果不了解触发器的具体的信息,或者需要查看数据库上所有触发器,是用 show triggers

实验

1 CREATE TRIGGER t_del_bak before DELETE on t FOR EACH ROW
2 BEGIN
3     set @id=OLD.ID,@`name`=OLD.name,@type=删除备份;
4     INSERT t_bak(id,`name`,`type`) VALUES(@id,@`name`,@type);
5 END

Mysql触发器

Mysql触发器,布布扣,bubuko.com

Mysql触发器

上一篇:Oracle 数据泵使用详解--精华版


下一篇:Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据