mysql 中的触发器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cofecode/article/details/83271861

有点像js的事件。可以监视某张表的操作,并触发相关操作

事先为某张表绑定一段代码,当表中的某些内容发生改变的时候(增删改),系统会自动触发代码,执行。

例子: 有两张表,一张订单表,一张商品表,每生成一个订单,意味着商品的库存要减少。

触发器

触发器:事件类型、触发事件、触发对象

事件类型:增删改

触发时间: 前后before after

注: 只有表才支持触发器,视图不支持。

每个表每个事件只允许一个触发器。因此,每张表最多有6个触发器(insert前后,update前后,delete前后)

创建触发器

语法:

create trigger t1(触发器名称)
after (触发时间)
insert  (事件类型)
on orders(哪张表,触发对象)
for each row (为每一行绑定)
begin (开始)
update goods xxx  (触发器的内容,每行内容都必须使用语句结束符,分号)
end;  (结束)

这里就产生了两个分号。这个时候我们需要
delimiter 自定义符号

临时修改语句结束符,后续代码中只有碰到自定义符号才算结束。

将临时修改修正过来

delimiter ;

例子
给orders表增加一个触发器

delimiter $

create trigger demo1 
after 
insert 
on orders 
for each row 
begin
update goods set num = num-1 where gid = 1; 
end$
delimiter ;

然后我们向orders表插入一条数据

insert into orders values(123,1,4);

发现goods表确实发生变化了

但是只是gid为1的num 仅仅减去了1

因为我们上面写死了,这里需要向触发器进行传参

需要先删除触发器

drop trigger demo1;
show triggers;

查看所有触发器,发现demo1触发器被我们删除掉了。

解决上述的问题。

old new

在MySQL中用old、new用来记录当前状态和即将执行后的新状态。

插入的时候,没有old
删除的时候,没有new

delimiter $

create trigger demo1 
after 
insert 
on orders 
for each row 
begin
update goods set num = num - new.much where gid = new.gid; 
end$
delimiter ;

猜你喜欢

转载自blog.csdn.net/cofecode/article/details/83271861