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;

    三、使用触发器

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

  • 相关阅读:
    WCF Server Console
    Restart IIS With Powershell
    RestartService (recursively)
    Copy Files
    Stopping and Starting Dependent Services
    多线程同步控制 ManualResetEvent AutoResetEvent MSDN
    DTD 简介
    Using Powershell to Copy Files to Remote Computers
    Starting and Stopping Services (IIS 6.0)
    java中的NAN和INFINITY
  • 原文地址:https://www.cnblogs.com/chushiyaoyue/p/5946675.html
Copyright © 2011-2022 走看看