zoukankan      html  css  js  c++  java
  • 触发器

    使用触发器可以定制用户对表进行的【增,删,改】操作时前后的行为。注意:没有查询。

    创建触发器:

      插入前:

        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 before 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

    例子:用户和日志表,每次创建一个用户后,就在日志表中生成这条记录。

    # 创建用户表
    create table user(
        id int primary key auto_increment,
        name varchar(20) not null,
        reg_time datetime, # 注册用户的时间
        affirm enum('yes','no') # no表示该用户执行失败
    );
    
    #创建日志表
    create table userLog(
        id int primary key auto_increment,
        u_name varchar(20) not null,
        u_reg_time datetime # 注册用户的时间
    );
    
    # 创建触发器 delimiter 默认情况下,delimiter是分号 触发器名称应遵循命名约定[trigger time]_[table name]_[trigger event]
    delimiter //
    create trigger after_user_insert after insert on user for each row
    begin
        if new.affirm = 'yes' then
            insert into userLog(u_name,u_reg_time) values(new.name,new.reg_time);
        end if;
    
    end //
    delimiter ;
    
    
    #往用户表中插入记录,触发触发器,根据if的条件决定是否插入数据
    insert into user(name,reg_time,affirm) values ('张三',now(),'yes'),('李四',now(),'yes'),('王五',now(),'no');
    
    
    # 查看日志表,发现多了两条记录 ,大家应该看到for each row就明白了
    
    mysql> select * from userlog;
    +----+--------+---------------------+
    | id | u_name | u_reg_time          |
    +----+--------+---------------------+
    |  1 | 张三   | 2018-06-14 17:52:49 |
    |  2 | 李四   | 2018-06-14 17:52:49 |
    +----+--------+---------------------+
    2 rows in set (0.00 sec)

    注意:在为insert定义的触发器中,仅可以使用new关键字,不能使用old关键字,但是在为delete定义的触发器中,没有新行,因此只能使用old关键字,在update触发器总,old是指更新前的行,new是指更新后的行。

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

    删除触发器:

    drop trigger 触发器名
  • 相关阅读:
    HDU 2899 Strange fuction
    HDU 2899 Strange fuction
    HDU 2199 Can you solve this equation?
    HDU 2199 Can you solve this equation?
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
  • 原文地址:https://www.cnblogs.com/stfei/p/9187693.html
Copyright © 2011-2022 走看看