zoukankan      html  css  js  c++  java
  • 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触发器执行失败,恢复执行过的操作,且在事务型的表上做标记。
  • 相关阅读:
    PHP、asp、aspx、JSP一句话
    Linux 修改时区(PDT修改为CST)
    m0n0防火墙安装配置方法
    kali 使用John破解zip压缩包的密码
    Linux 挂载windows共享文件夹
    博客园添加粒子特效
    wpscan 更新超时报错
    kali 攻击wordpress + trunkey linux wordpress 安装方法
    Kali和Metasploitable2的网络配置
    设计模式之观察者
  • 原文地址:https://www.cnblogs.com/tangyue/p/3684959.html
Copyright © 2011-2022 走看看