需求:
-- 商品表: goods
-- 订单表: order
-- 当下一个订单时,对应的商品相应的减少(买几个商品就少几个库存)
分析:
-- 监视谁: order
-- 监视动作: insert
-- 触发时间: after
-- 触发事件: update
查看已有trigger: show triggers;
删除已有trigger: drop trigger triggerName;
触发器格式
create trigger triggerName
after/before
insert/update/delete
on
tableName
for each row
begin
此处可定义变量;(declare argsName type)
--type为参数的格式,如:int,char(1)
sql语句;
end;
第一个触发器(新增操作):
create
trigger t1 --(创建一个触发器)
after
insert
on
order --(在order表进行insert操作之后)
for each row
begin
update goods set num = num - 2 where gid = 1 --(触发事件)
end;
第二个触发器(新增操作):
create trigger t2 --(创建一个触发器)
after
insert
on order --(在order表进行insert操作之后)
for each row
begin
update goods set num=num-new.much where gid=new.gid; --(触发事件,new.much代表新增一条数据中much字段的值)
end;
第三个触发器(删除操作):
create trigger t3 --(创建一个触发器)
after
delete
on order --(在order表进行delete操作之后)
for each row
begin
update goods set num=num+old.much where gid=old.gid; --(触发事件,old.much代表删除一条数据中much字段的值)
end;
第四个触发器(修改操作):
create trigger t4 --(创建一个触发器)
before
update
on order --(在order表进行update操作之前)
for each row
begin
update goods set num=num+old.much-new.much where gid=old.gid;
--(触发事件,首先将原有数据删除,此时将商品退回goods,所以+old.much,然后新增你要修改的数据,所以-new.much)
end;
-- 思考: before与after的区别
-- 在思考: 如果购买商品的数量小于客户购买的数量,会发生什么情况,能否预防
-- 能否在购买数量much > 库存量num时,将much自动改为num
-- 提示: before下手
第五个触发器
create trigger t5 --(创建一个触发器)
before
--(此处必须使用before,如果使用after将报错)
--(原因: insert之后,new行已经插入到表中,成为事实,此时在修改已经晚了)
insert
on order --(在order表进行insert操作之后)
for each row
begin
declare rnum int; --(这句代码在MySQL中必须写在begin和end之间,Oracle不要求)
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; --(触发事件,new.much代表新增一条数据中much字段的值)
end;
触发器中 for each row的作用
--在Oracle中触发器,触发器分为语句级触发器和行级触发器
--比如
create trigger t6
after update
on tableName
for each row --每一行受影响,触发器都会执行,所以叫做行级触发器
begin
sql语句;
end;
# 下面sql语句会被触发多少次
# 触发器创建后,执行update tableName set xx=xx where id<100;假设有100条数据满足此条件
--答: 会被触发100次
--在Oracle触发器中,如果for each row不写,无论update语句一次影响多少行,只执行一次