mysql触发器

1、触发器定义:进行数据库应用软件开放时,我们有时会碰到表中的某些数据改变希望同时引起其他相关数据的改变的需求利用触发器就能满足这样的要求。它能在表中的某些特殊数据变化时自动完成某些查询、更新运用触发器不仅可以简化程序,而且可以增加程序的灵活性。
触发器时一类特殊的事务
可以监视某种数据操作(insert/update/delete)
并触发相关操作(insert/update/delete)
2、应用场景
 例如:
当一个订单生成,相应库存减少
某客户进行欠款消费、可以在生成订单时通过设计触发器判断该客户的累计欠款是否超过了最大限度
当有新订单产生时,需要及时通知相关人员进行处理,此时可以在订单表上设计添加触发器加以实现
 
 
3、触发器创建语法之4要素
监视地点:table
监视事件:insert,update,delete
监视时间:after,before
触发事件:insert/update.delete
查看已有triggers:show triggers;
删除triggers: drop trigger +名称
4、手动写一个触发器
需求:
商品表:goods表
订单表:ord表
当下1个订单时,对应的商品要响应减少(买几个商品少几个)
分析:
监视谁:ord表
监视动作:insert
触发时间:暂选after
触发事件:update
 
create trigger tri1
after
insert
on ord
for each row
begin
update googs xxx
end ;
创建商品表
create table goods(
gid int,
name varchar(20),
num smallint
);
创建订单表
create table ord(
oid int,
gid int,
much smallint
);
insert into goods values(1,'cat',34);
insert into goods values(2,'dog',65);
insert into goods values(3,'pig',21);

 

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

 触发器验证:

 5、触发器引用变量

插入时新行用new.列名  

删除时旧行old.列名

update goods set num=num-new.much where gid=new.gid;

update goods set num=num+old.much where gid=old.gid;

create  trigger tri4

before

update

on ord

for each row

begin

update goods set num=num+old.much -new.much where gid=old.gid;

end$

 

 
6、订单实现,不爆仓的情况
create trigger t6ew.gid
before
insert
on ord
for each row
begin
declare
rnum int;
select num into rnum from goods where gid=new.gid;
if new.much > rnum then
set new.much=rnum;
end if;
update goods set num=num-new.much where gid =new.gid;
end$
 
 
触发器中for each row 是干嘛的?
在oracle 触发器中,触发器分语句及和触发器行级触发器
比如:create trigger tn
after
update
on xxtable
for each row
begin
sqlN/
end
执行update xxtable set xxx ==xxx where id>100 修改了100行
行级触发器:
在oracle中
for each row 如果不写
无论update 语句一次影响了多少行,都触发一次
mysql目前不支持语句级的触发器
insert ,产生的数据,能否在触发器中引用到?
posted @ 2025-06-08 14:54  Harda  阅读(15)  评论(0)    收藏  举报