您的位置:首页 > 博客中心 > 数据库 >

MySQL数据库中的触发器

时间:2022-03-14 15:22

--触发器是一类特殊的监控增删改操作,并产生相应的增删改的操作
--1,监视谁   2,监视动作   3,监视时间(之前或之后)  4,触发的事件
--触发器的简单语法

 

create trigger 触发器名字  after/before(触发时间)
   insert/delete/update(监视事件) on 表名 (监视地址)
   for each row   begin sql语句;   end;

 

--因为一条sql语句只能有一个边界符,所以上面语句会发生错误,用delimiter $
--将边界符改为$ 这样就不会发生冲突
--同一个表在同一时间同意动作不能有不同的触发器
--查看已有的触发器 show triggers;
--删除指定的触发器 drop trigger 触发器名字;

 

--建表语句
create table goods(
goods_id int not null,
goods_name varchar(30) not null default ‘‘,
goods_num int 
)engine myisam charset utf8; 


--插入数据
insert into goods values (1,‘cat‘,32),(2,‘dog‘,42),(3,‘rab‘,43);

--创建订单表
create table ord(
id int not null,
goods_id int not null,
num int not null default 0
)engine myisam charset utf8;

 

--更改边界,最后不需要分号;
delimiter $
--创建触发器,当ord表插入一条数据(1,1,1)时 商品cat数量减1
create trigger trig1
after
insert
on ord
for each row
begin
update goods set goods_num=goods_num-1 where goods_id=1;
end$

--然后插入一条数据
insert into ord values (1,1,1)$
--goods表确实减少了1,但是这个触发器不具有通用性,
--不管买几个商品和买多少商品,总是cat商品减1
drop trigger trig1$

--旧的一行数据对象old,新的一条数据对象new
create trigger trig2
after
insert
on ord
for each row
begin
update goods set goods_num=goods_num-new.num where goods_id=new.goods_id;
end$

--这个触发器具有通用性

--监控delete语句,当删除订单时,需要再把商品加回来
create trigger trig3
after
delete
on ord
for each row
begin
update goods set goods_num=goods_num+old.num where goods_id=old.goods_id;
end$

--监控update语句,当更新表时,产生相应的操作,在不修改商品类型的情况
create trigger trig4
after
update
on ord
for each row
begin
update goods set goods_num=goods_num+old.num-new.num where goods_id=new.goods_id;
end$

--在这种情况下,会出现爆仓的情况,因为更新的数据可能超过商品的库存量
drop trigger trig4$
create trigger trig4
before
update
on ord
for each row
begin
declare gnum int;
select goods_num into gnum from goods where goods_id=new.goods_id;
if (new.num-old.num)>gnum then
set new.num=gnum+old.num;
end if;
update goods set goods_num=goods_num+old.num-new.num where goods_id=new.goods_id;
end$

--insert也会出现这种情况,也要更改一下
drop trigger trig2$
create trigger trig2
before
insert
on ord
for each row
begin
declare gnum int ;
select goods_num into gnum from goods where goods_id=new.goods_id;
if new.num>gnum then
set new.num=gnum;
end if;
update goods set goods_num=goods_num-new.num where goods_id=new.goods_id;
end$

 

本类排行

今日推荐

热门手游