首页 > 代码库 > mysql--触发器
mysql--触发器
一、触发器的概念
触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。
触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete)。
二、触发器的操作
1、创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt----------------------------------------------------------Create trigger triggerNameAfter/before insert/update/delete on -- 表名For each row -- 这句话是固定的BeginSql语句; -- 一句或多句,insert/update/delete范围内End;
- 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与临时表表或视图关联起来。
- trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。
- trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:
INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
- for EACH ROW 是固定语句,目前mysql只支持到行操作
- trigger_stmt是当触发程序激活时执行的语句。如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。这样,就能使用存储子程序中允许的相同语句。
创建实例:
-- 插入前CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROWBEGIN ...END-- 插入后CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROWBEGIN ...END-- 删除前CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROWBEGIN ...END-- 删除后CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROWBEGIN ...END-- 更新前CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROWBEGIN ...END-- 更新后CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROWBEGIN ...END
创建最好先检查触发器,目前一个表只支持一个同一类型的触发器:
show triggers;
drop trigger if exists tri_before_insert_tb1;delimiter $$create TRIGGER tri_before_insert_tb1 before insert on A for each ROWBEGIN insert into B(bName) value(‘ggggggggggggg‘);END $$delimiter ;show TRIGGERs
drop trigger if exists tri_before_insert_tb1;delimiter $$create TRIGGER tri_before_insert_tb1 after insert on A for each ROWBEGIN insert into B(bName) value(‘ggggggggggggg‘);END $$delimiter ;show TRIGGERs
注意:
如何在触发器引用行的值
对于insert而言, 新增的行 用new 来表示,行中的每一列的值 ,用new.列名来表示.
对于 delete来说, 原本有一行,后来被删除,想引用被删除的这一行,用old,来表示, old.列名,就可以引用被删行中的值.
对于update来说,被修改的行.
修改前的数据 ,用 old来表示, old.列名引用被修改之前行中的值
修改后的数据,用new 来表示, new.列名引用被修改之后行中的值
注意:
触发器里after 和before的区别
After 是先完成数据的增,删,改再触发,触发的语句晚于监视的增,删,改,无法影响前面的增删改动作.
Before是先完成触发,再增删改,触发的语句先于监视的增,删,改发生,我们有机会判断,修改即将发生的操作.
二、删除触发器
DROP TRIGGER tri_after_insert_tb1;
三、使用触发器
触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。
mysql--触发器