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 ;
