16 触发器

作者: 笑Skr人啊 | 来源:发表于2017-12-29 10:58 被阅读14次

需求:

--  商品表: 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语句一次影响多少行,只执行一次

相关文章

网友评论

    本文标题:16 触发器

    本文链接:https://www.haomeiwen.com/subject/jikigxtx.html