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 triggerName

After/before insert/update/delete on -- 表名

For each row  -- 这句话是固定的

Begin

Sql语句; -- 一句或多句,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 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;

三、使用触发器

触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。

原文地址:https://www.cnblogs.com/chushiyaoyue/p/5946675.html