导航

MySQL触发器

Posted on 2019-08-25 13:52  司恩波  阅读(176)  评论(0编辑  收藏  举报

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