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 ;