zoukankan      html  css  js  c++  java
  • 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;

    三、使用触发器

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

  • 相关阅读:
    Windows Server 2012 两台服务器文件同步
    Linux下非root用户运行Tomcat
    Linux离线安装mysql 5.6详细步骤
    spring再学习之整合JDBC
    spring再学习之AOP实操
    spring再学习之AOP准备
    spring再学习之注解
    spring再学习之配置详解
    spring再学习之基本概念
    spring再学习之简单测试
  • 原文地址:https://www.cnblogs.com/chushiyaoyue/p/5946675.html
Copyright © 2011-2022 走看看