日期:2014-05-16  浏览次数:20901 次

MySQL触发器的基本使用
MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序,是MySQL 5版本新增的功能。本文介绍了触发器的类型和基本使用方法,讲述了触发器使用中容易产生的误区,从MySQL源码中得到触发器执行顺序的结论,本文最后是实战遭遇的触发器经典案例。没有特殊说明时,本文的实验均基于mysql5.1.51版本。
一、Mysql触发器的基本使用

① 创建触发器

创建触发器语法如下:

view plain   copy

    CREATE TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt

■ trigger_name:标识触发器名称,用户自行指定;

■ trigger_time:标识触发时机,用before和after替换;

■ trigger_event:标识触发事件,用insert,update和delete替换;

■ tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;

■ trigger_stmt:触发器程序体。

触发器程序可以使用begin和end作为开始和结束,中间包含多条语句。下面给出一个触发器实例:

view plain   copy

    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列则可以在触发器程序中再次赋值。

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

② 查看触发器

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

view plain   copy

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

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

view plain   copy

    SHOW TRIGGERS;
    //查看所有触发器

用上述方式查看触发器可以看到数据库的所有触发器,不过如果一个库上的触发器太多,由于会刷屏,可能没有办法查看所有触发器程序。这时,可以采用如下方式:

MySQL中有一个information_schema.TRIGGERS表,存储所有库中的所有触发器,desc information_schema.TRIGGERS,可以看到表结构:

view plain   copy

    +----------------------------+--------------+------+-----+---------+-------+
    | Field                      | Type         | Null | Key | Default | Extra |
    +----------------------------+--------------+------+-----+---------+-------+
    | TRIGGER_CATALOG            | varchar(512) | YES  |     | NULL    |       |
    | TRIGGER_SCHEMA             | varchar(64)  | NO   |     |         |       |
  &