MySQL的触发器

 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 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;
    上述触发器实例使用了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语句触发;
四、MySQL触发器执行顺序
      关于MySQL触发器的几个问题?
1.如果在before类型的触发器执行失败,sql语句会执行成功吗?
下面来做个测试:
     MySQL的触发器


MySQL的触发器

通过上述测试我们可以知道,当before类型的触发器执行失败时,sql语句不会执行。

before类型的触发器是在sql语句执行前就触发触发器,所以会报MySQL的触发器

这样的错误。
2.如果after类型的触发器执行失败时,sql语句也会执行失败吗?
下面来做个实验:


MySQL的触发器
 
MySQL的触发器
 
MySQL的触发器
通过上述实验你会发现,在after类型的触发器中,sql执行失败后,触发器不会被触发。
 
MySQL触发器执行的顺序:
   1)   如果before型触发器执行失败,不会执行后续sql语句;

     2)   如果sql执行失败,不会执行或许的after型触发器;

     3)   如果after触发器执行失败,恢复执行过的操作,且在事务型的表上做标记。
posted on 2014-04-24 11:00  smile小红帽  阅读(290)  评论(0编辑  收藏  举报