`[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 ;