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表:

1481388094096

login表:

1481388132055

创建触发器代码:

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表:

1481388762534

part表:

1481388790242

扩展:
代码的执行,可以先将触发器创建后,在单独的执行,然后可以将创建触发器的代码隐藏,单独执行操作代码。

触发器特殊值

  • 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表:

1481389719055

login表:

1481389748977

分析:
两个表最后增加的数据是一样的。

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

1481390653251

login表:增加 y

1481390682770

扩展:
既然是存在新旧数据的获取,那么更新的时候,有新数据也有旧数据,则,这两个特殊方法,都能获取对应的。

原文地址:https://www.cnblogs.com/jayafs/p/6181004.html