`[TOC]

一、触发器介绍

触发器,顾名思义就是通过某个特定的事件来触发另外一个事件,我们把”通过某个特定的事件“称为触发条件,这个条件有INSERT,UPDATE,DELETE,最终触发另外一个事件就是我们具体要数据库操作的步骤。

触发器其是一种特殊的存储过程。一般的存储过程是通过存储过程名直接调用,而触发器主要是通过事件(增、删、改)进行触发而被执行的。其在表中数据发生变化时自动强制执行。

常见的触发器有两种:after(for)、instead of,用于insert、update、delete事件。after(for) 表示执行代码后,执行触发器instead of 表示执行代码前,用已经写好的触发器代替你的操作

二、触发器语法

注意:触发条件和触发事件不能作用于同一张表中!

创建一个一条执行语句的触发器:

CREATE TRIGGER 触发器名 [BEFORE/AFTER] [INSERT/UPDATE/DELETE] ON 表名 FOR EACH ROW 执行语句;

创建一个多条执行语句的触发器:

CREATE TRIGGER 触发器名 [BEFORE/AFTER] [INSERT/UPDATE/DELETE] ON 表名 FOR EACH ROW BEGIN 执行语句列表 END;

一般情况下,MySQL默认是以“;”作为结束执行语句。在创建触发器过程中需要用到“;”。为了解决这个问题,可以用DELIMITER语句。如“DELIMITER
&&”,可以将结束符号变成“&&”。当触发器创建完成后,可以用命令“DELIMITER
;”来将结束符号变成“;”。

查看触发器:

SHOW TRIGGERS;

删除触发器:

DROP TRIGGER 触发器名;

三、触发器示例

1.常规触发器

CREATE TRIGGER `UPDATE_WEIXIN_FANS_SEX` AFTER INSERT ON `o_fans_sex` FOR EACH ROW
BEGIN
    UPDATE weixin
SET weixin.male_powder = concat(
    ROUND(
        (
            new.man_count / (
                new.women_count + new.man_count + new.unknow_count
            )
        ),
        2
    ) * 100,
    '%'
),
 weixin.female_powder = concat(
    ROUND(
        (
            new.women_count / (
                new.women_count + new.man_count + new.unknow_count
            )
        ),
        2
    ) * 100,
    '%'
)
WHERE
    weixin.wxh_name = new.wxh_name;


END;

2.一般情况下,MySQL默认是以“;”作为结束执行语句。在创建触发器过程中需要用到“;”。为了解决这个问题,可以用DELIMITER语句。如“DELIMITER
&&”,可以将结束符号变成“&&”。当触发器创建完成后,可以用命令“DELIMITER
;”来将结束符号变成“;”。
创建一个由DELETE触发多个执行语句的触发器dept_trig2。

(1) 创建dept_trig2触发器的SQL代码如下:

DELIMITER &&
CREATE TRIGGER dept_trig2 AFTER DELETE
ON department FOR EACH ROW
BEGIN
INSERT INTO trigger_time VALUES('22:30:30');
INSERT INTO trigger_time VALUES('23:50:50');
END
&&
DELIMITER ;