• 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$
    
  • 相关阅读:
    【转】C#解析HTML 拓荒者
    【转】Sql递归查询 拓荒者
    【转】sql if else 语句 拓荒者
    数据库范式解析 拓荒者
    C#和sqlserver中生成新的32位GUID 拓荒者
    Linq To Sql CRUD操作示例 拓荒者
    让UserControl可以被验证 拓荒者
    【转】把一个表的数据插入到另一个表:INSERT INTO SELECT / SELECT INTO 拓荒者
    【转】Sql去除重复记录 拓荒者
    Linq To Object 示例 拓荒者
  • 原文地址:https://www.cnblogs.com/lzzhuany/p/4881988.html
Copyright © 2020-2023  润新知