zoukankan      html  css  js  c++  java
  • 小贝_mysql 触发器使用

    触发器

    简要
    1、触发器基本概念
    2、触发器语法及实战样例
    3、before和after差别

     

    一、触发器基本概念

    1、一触即发

    2、作用: 监视某种情况并触发某种操作

    3、观察场景

    一个电子商城:

    商品表,goods

    主键(goods_id)

    商品名称(goods_name)

    库存(goods_number)

    1

    iphone6

    10

    2

    小米手机

    28

     

    订单表,orders

    订单主键(order_id)

    商品主键(goods_id)

    购买数量(buy_num)

    1

    2

    3

    2

    1

    4

    从php的角度看,完毕下单与降低库存的逻辑例如以下:

    a、下单后。往orders表插入数据:

    insert into orders(goods_id,bug_num)values(2,3);

    b、改动goods相应商品的库存:

           update goods setgoods_number=goods_number-3 where goods_id=2;

    总结: 这两个逻辑能够看成是一个总体,或者说,insert—>触发update

    处理方案: 使用触发器来解决上述问题,我们能够监视某张表的变化,当发生某种变化时,触发某个操作

    4、触发器监视以及触发什么变化

           a、监视update/insert/delete

           b、触发update/insert/delete


    二、触发器语法

    1、创建语法的四个要素

     

    2、创建触发器

    2.1、測试案例的表结构

    #商品表

    create table goods

    (goods_id int,goods_name varchar(10),goods_number smallint)charset=utf8;

     

    insert into goods

    values(1,'iphone6',10),(2,'小米手机',28);

    #订单表

    create table orders

    (order_id int,goods_id int,buy_num smallint)charset=utf8;

     

    insert into orders

    values(1,2,3),(2,1,4);


    2.2、创建触发器语法


    createtrigger triggerName

    after/beforeinsert/update/deleteon Table

    begin

           sql语句(一句或多句sql)

    end;

    2.3、触发器实例

    2.3.1、建立触发器。往订单表orders插入数据时,更新商品表goods的库存量


    往orders表插入数据前,各个表的数据例如以下


    往orders表插入数据:


    查看goods表的数据:


    此时,orders表插入的是iphone6两台,可是降低的却是小米手机商品的库存。

    当往orders表插入的是小米手机两台呢?


    此时,降低的也是小米手机。可是降低的是1,而不是2

    问题:出在哪里?

    1、查看刚建立的触发器信息


    原来触发的sql语句是固定某个商品id的。因此。触发仅仅对该商品id发生作用

    2、怎样在触发器引用行的值?

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

    3、改动触发器t1(删除原来又一次建立)


    4、验证结果

    插入前,各个表数据例如以下


    插入orders表。iPhone6三台


    插入orders表,小米手机五台

     

    2.3.2、建立触发器,往订单表orders删除数据时,更新商品表goods的库存量

    a、建立触发器t2


    b、删除orders的数据

           b1、删除前。各个表数据


           b2、删除后。各个表数据:


    总结:

    对于delete而言。怎样在触发器引用行的值?

    对于delete操作来说。它要操作的数据,已经是存在表中了,因此用old来表示,行中的每一列的值,用old.列名来表示

     

    2.3.3、建立触发器,往订单表orders改动数据时。更新商品表goods的库存量

    a、创建触发器t3


    b、改动orders表数据

           b1、改动前,各个表的数据


           b2、改动后。各个表的数据

     

    总结:

    对于update而言,怎样在触发器引用行的值?

    对于update操作来说。它要操作的数据,已经是存在表中了,因此用old来引用改动前的值,改动后则为用new来引用新值

     

    2.4、查看触发器和删除触发器语法

    2.4.1、查看全部触发器


    2.4.2、查看某个触发器

     

    2.4.3、删除触发器

     

     

    三、before与after的差别

    1、差别:

    a、after是先完毕数据的增删改后。再触发

    触发中的语句晚于增删改,无法影响前面的增删修改作

    b、before是先完毕触发,再增删改

    触发的语句先于监视的增删改发生,我们有机会推断,改动即将发生的操作

    2、案例:

    对于所下订单进行推断,假设订单的数据>5,则觉得是非法订单,强制把所订商品数据改成5

    2.1、建立触发器


    2.2、插入前。各个表的数据


    2.3、插入后。各个表的数据




    The quieter you become。the more you are able to hear!

  • 相关阅读:
    HDU3440 House Man (差分约束)
    POJ1201 Intervals (差分约束)
    POJ2154 Color【 polya定理+欧拉函数优化】(三个例题)
    【2018年全国多校算法寒假训练营练习比赛(第三场)】
    数据人看Feed流-架构实践
    开源背后 | 面对端侧推理引擎的挑战,阿里工程师如何应对?
    容器十年 ——一部软件交付编年史
    公网对讲行业大咖分享:铁通电子为何选择阿里云?
    逾期率飙升如何破?揭秘金融科技如何化解消费金融行业风险
    微服务开源生态报告 No.2
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7354691.html
Copyright © 2011-2022 走看看