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

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

    一、创建触发器

    复制代码
    # 插入前
    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
    复制代码

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

    准备表:

    复制代码
    # 创建用户表
    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 trigger_userLog;
  • 相关阅读:
    angularjs-ngTable select filter
    angularjs-ngModel 控制页面的宽度
    angularjs-ngModel传值问题
    Jquery中去除左右空格
    Python命令行下退格、删除、方向键乱码问题解决
    linux解压.tar.xz的方法
    python OS模块详解
    pip is configured with locations that require TLS/SSL, however the ssl module in Python is not
    centos7 python2.7.5 升级python3.6.4
    使用mkfs.ext4格式化大容量磁盘
  • 原文地址:https://www.cnblogs.com/zsdbk/p/9196489.html
Copyright © 2011-2022 走看看