• MySQL触发器


    MySQL触发器

    2019-08-24

    触发器是定义一种关联行为,当对某个表的行级进行一次增删改的行为时,通过触发器自定义一个关联操作。

    触发器激活后即进入后台运行,直到关闭触发器为止。

    触发器激活语法格式:

    --触发器
    --先修改结束符,防止触发器操作的误结束
    delimiter //
    create trigger 触发器名 触发条件 on 表名 for each row
    begin
        触发器的操作;
    end //
    --再将结束符改回原样
    delimiter ;

    触发器名:即类似于编程语言中的变量名,由自己创建;

    触发条件:有6个,分别是1)before insert 2)after insert 3)before delete 4)after delete 5)before update 6)after update;

    触发器关闭的语法格式:

    drop trigger 触发器名;

    触发器需要使用触发动作的内容时,可借助关键字NEW和OLD。

    NEW:指新数据,在insert或者update时使用,代表新插入的数据或者更新的新数据;

    OLD:指老数据,在delete或者update时使用,代表被删除的或者被更新的数据;

    实例:

    假设有一个userinfo表用于记录人员信息,一个record表用于记录userinfo表的历史操作,实现每修改一条数据都有相应的记录;记录当时的时间,修改方式以及被修改的用户姓名。

    --行为表,作外键使用
    create table behavior(
        id int auto_increment primary key,
        action char(20)
        )engine=innodb default charset=utf8;
    
    insert into behavior(action) values("insert"),("delete"),("update");
    
    --记录表
    create table record(
        id int auto_increment primary key,
        ac_time Datetime,
        action_id int not null,
        name char(20),
        constraint fk_rcd_bhr foreign key (action_id) references behavior(id)
        )engine=innodb default charset=utf8;
    
    --用户表
    create table userinfo(
        id int auto_increment primary key,
        name char(20) not null,
        age int,
        depart char(20)
        )engine=innodb default charset=utf8;
    
    --增加用户记录时
    delimiter //
    create trigger trg_insert before insert on userinfo for each row
    begin
        insert into record(ac_time,action_id,name) values(NOW(),1,NEW.name);
    end //
    --再将结束符改回原样
    delimiter ;
    
    --删除用户时
    delimiter //
    create trigger trg_delete before delete on userinfo for each row
    begin
        insert into record(ac_time,action_id,name) values(NOW(),2,OLD.name);
    end //
    --再将结束符改回原样
    delimiter ;
    
    --修改记录时
    delimiter //
    create trigger trg_uodate before update on userinfo for each row
    begin
        insert into record(ac_time,action_id,name) values(NOW(),2,OLD.name);
        insert into record(ac_time,action_id,name) values(NOW(),1,NEW.name);    
    end //
    --再将结束符改回原样
    delimiter ;
    View Code
  • 相关阅读:
    TS流批量下载----------Xamarin开发系列
    TS视频流下载合成
    B站缓存视频音频合并
    ActiveX录音插件
    FZU-2191 完美的数字 简单数论
    COCI2011/2012 破解密文 KMP
    COCI2010/2011 踢踏舞 线段树区间子段和
    [USACO03FALL] 受欢迎的牛-G tarjan缩点
    洛谷 P1967 货车运输 最大生成树+倍增LCA
    洛谷 P1613 跑路 倍增+最短路
  • 原文地址:https://www.cnblogs.com/sienbo/p/11403868.html
Copyright © 2020-2023  润新知