版权声明:本文为博主原创文章,未经博主允许不得转载。 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 ;