zoukankan      html  css  js  c++  java
  • MySQL数据库中的触发器

    --触发器是一类特殊的监控增删改操作,并产生相应的增删改的操作
    --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$
    
  • 相关阅读:
    HDU1029 Ignatius and the Princess IV
    UVA11039 Building designing【排序】
    UVA11039 Building designing【排序】
    POJ3278 HDU2717 Catch That Cow
    POJ3278 HDU2717 Catch That Cow
    POJ1338 Ugly Numbers(解法二)
    POJ1338 Ugly Numbers(解法二)
    UVA532 Dungeon Master
    UVA532 Dungeon Master
    POJ1915 Knight Moves
  • 原文地址:https://www.cnblogs.com/lzzhuany/p/4881988.html
Copyright © 2011-2022 走看看