MySQL触发器
引入
对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。
具体分析
语法:
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW BEGIN ... END
分析:
CREATE:创建。
TRIGGER:触发器,后面跟的是触发器的名字。
BEFORE:表示插入位置,在前面。
INSERT:触发器的触发的时机,如:上面代码表示;在tb1的数据插入之前创建触发器。
ON:绑定被插入的对象,后面接被操作的对象。
FOR EACH ROW:固定格式,表示后面每行都如下操作。
案例:
数据表对应的信息
part表:
login表:
创建触发器代码:
delimiter $$ create trigger tri_before_inster_part before insert on part for each ROW BEGIN insert into login(name) values("xxx"); end $$ delimiter ;
分析:
上面代码表示,在psrt插入数据的时候,执行begin和end中的代码,往login表中添加数据。
执行往part中加入数据代码:
delimiter $$ create trigger tri_before_inster_part before insert on part for each ROW BEGIN insert into login(name) values("xxx"); end $$ delimiter ; insert into part(caption) values("ss");
结果:
login表:
part表:
扩展:
代码的执行,可以先将触发器创建后,在单独的执行,然后可以将创建触发器的代码隐藏,单独执行操作代码。
触发器特殊值
- old
- new
new
新插入的数据,这数据是操作之前没有的,新增的。
前面代码的执行,都是我们直接传入的,但是如果我想将我插入part表的数据,也同样插入到login中。
代码:
delimiter $$ DROP trigger if EXISTS tri_before_inster_part $$ create trigger tri_before_inster_part before insert on part for each ROW BEGIN insert into login(name) values(new.caption); end $$ delimiter ; insert into part(caption) values("ss");
结果:
part表:
login表:
分析:
两个表最后增加的数据是一样的。
old
表示在触发器操作前存在的数据,这变化的时候,可以获取。
需求:我想在part的数据删除前,将part的所删除的数据增加到login中。
代码:
delimiter $$ DROP trigger if EXISTS tri_before_delete_part $$ create trigger tri_before_delete_part before delete on part for each ROW BEGIN insert into login(name) values(old.caption); end $$ delimiter ; DELETE FROM part where nid = 7;
结果:
part表:删掉了 y
login表:增加 y
扩展:
既然是存在新旧数据的获取,那么更新
的时候,有新数据也有旧数据,则,这两个特殊方法,都能获取对应的。