使用触发器

触发器:它是一个特殊的存储过程,它是MySQL在insert、update、delete的时候执行,自动执行,不能直接调用。

它包含四个要素:

1. 监视地点(table)

2. 监视事件(insert/update/delete)

3. 触发时间(after/before)

4. 触发事件(insert/update/delete

触发器

  1. 语法

    create trigger trigger_name
    
    after/before   insert/update/delete on tb_name
    
    for each row
    
    begin
    
    sql 语句:(触发的语句一句或者多句)
    
    end;

  2. 现有两张表 商品表 goods 和订单表 order 来说明触发器的工作原理;


  3. 我们现在往goods表添加四条记录

    insert into goods (goods_name,goods_num) values("手机",20),("电脑",30),("单反",20);
  4. 实现购买任意商品,对应的商品数量相应的减少:

    分析:

    监视地点:order 表 

    监视事件:insert操作

    触发时间:在insert操作之后

    触发事件:update操作

    CREATE TRIGGER t1
    
    AFTER  INSERT ON `order`
    
    FOR EACH ROW
    
    BEGIN
    
    UPDATE goods SET goods_num=goods_num-new.order_num WHERE goods_id=new.goods_id;
    
    END;

  5. 如 我们购买5个手机:

    INSERT INTO `order` (goods_id,order_num) VALUES(1,5);

    注:对于insert 而言 新增的行使用new 来表示,行中的每一列的值用 new.列名来表示

    这时我们会发现goods表、order表的数据如下:                                                                                          

  6. 撤销订单:

    分析:

    监视地点:order 表

    监视事件:delete操作

    触发时间:在delete操作之后

    触发事件:update操作                                                                                                                                                    

    DROP TRIGGER if EXISTS t1;
    
    CREATE TRIGGER t1
    
    AFTER DELETE ON `order`
    
    FOR EACH ROW
    
    BEGIN
    
    UPDATE goods SET goods_num=goods_num+old.order_num WHERE goods_id=old.goods_id;
    
    END;
    

  7. 现在要取消刚才买的5个手机的订单:

    DELETE FROM `order` WHERE order_id=1;

    注:对于delete而言   删除的行使用old 来表示, 行中的每一列的值用 old.列名来表示

    这时我们会发现goods表、order表的数据发生了如下的变化:


  8. 修改订单(包括修改购买的数量以及购买的商品)

    分两步:

    1. 撤销订单;(delete);

    2. 新增订单:(insert);                                                                                                                                              

    DROP TRIGGER if EXISTS t1;
    
    CREATE TRIGGER t1
    
    AFTER UPDATE ON `order`
    
    FOR EACH ROW
    
    BEGIN
    
    -- 撤销订单
    
    UPDATE goods SET goods_num=goods_num+old.order_num WHERE goods_id=old.goods_id;
    
    -- 新增订单
    
    UPDATE goods SET goods_num=goods_num-new.order_num WHERE goods_id=new.goods_id;
    
    END;
    
    UPDATE `order` SET goods_id=2,order_num=4 WHERE order_id=2;

    现在看下两张表的变化:


9 对触发器的使用做以下几点说明

触发器的名字在每个表中唯一,但不是在每个数据库中唯一;

只有表才支持触发器,视图不支持(临时表也不支持);

触发器不能更新或者覆盖,为了修改一个触发器,必须要先删除它,然后再创建;

MySQL触发器不支持CALL语句,这表示不能从触发器内调用存储过程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值