时间:2021-07-01 10:21:17 帮助过:2人阅读
触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。
触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete)。
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ---------------------------------------------------------- Create trigger triggerName After/before insert/update/delete on -- 表名 For each row -- 这句话是固定的 Begin Sql语句; -- 一句或多句,insert/update/delete范围内 End;
INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
创建实例:
-- 插入前 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW BEGIN ... END -- 插入后 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW BEGIN ... END -- 删除前 CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW BEGIN ... END -- 删除后 CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW BEGIN ... END -- 更新前 CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW BEGIN ... END -- 更新后 CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW BEGIN ... END小实例
创建最好先检查触发器,目前一个表只支持一个同一类型的触发器:
show triggers;
drop trigger if exists tri_before_insert_tb1; delimiter $$ create TRIGGER tri_before_insert_tb1 before insert on A for each ROW BEGIN 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 ROW BEGIN 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--触发器
标签: