触发器

来源:互联网 发布:php测试链接ftp服务器 编辑:程序博客网 时间:2024/06/06 21:03

1).作用

    监视某种情况并触发某种操作    观察以下场景:一个电子城商城    商品表,g    +--------------+--------------+--------------+    |      主键     |    商品名字   |      库存     |    +--------------+--------------+--------------+    |       1      |      电脑     |      28      |    +--------------+--------------+--------------+    |       2      |     自行车    |       12     |    +--------------+--------------+--------------+    订单表,o    +--------------+--------------+--------------+    |    订单主键    |    商品外键   |    购买数量    |    +--------------+--------------+--------------+    |       1      |      2       |      3       |    +--------------+--------------+--------------+    |       2      |      1       |       5      |    +--------------+--------------+--------------+    完成订单减少库存的逻辑    insert into o (gid,num) values (2,3),//插入语句    Update g set goods num = goods num - 3 where id = 2;//跟新过程    这俩个逻辑可以看成一个整体,或者说,insert--->引来update    我们可以监视某表的变化,当发生某种变化时触发某个操作

2).触发器的定义

    能监视:增,删,改    触发操作:增,删,改

3).触发器的四要素

    监视地点:table    监视事件:insert/update/delete    触发时间:after/before    触发事件:insert/update/delete

4).触发器的创建语法

    Create trigger triggerName    After/before  insert/update/delete on 表名    For each row #这句话是固定的    Begin    Sql语句:#一句或多句,insert/update/delete 范围内    End    -->删除触发器的语法    Drop trigger 触发器名    -->修改结束语句的符号    delimiter $

5).创建简单触发器

    ①:增加一个订单,库存相应减小    #监视地点  o 表    #监视事件  insert    #触发事件  update    #触发时间  after    ---对于insert而言,新增的行用new来表示,行中的每一列的值,用new.列名来表示。    create trigger tg1    after insert on o    for each row    begin    update g set num = num - new.much where id = new.gid;    end$    ②:删除一个订单,库存相应增加    #监视地点  o 表    #监视事件  delete    #触发事件  update    #触发时间  after    ---对于delete来说,原本有一行,后来被删除,想要引用被删除的这一行,old来表示,old.列名,就可以引用被删除列中的值    create trigger gt2    after delete on o    for each row    begin    update g set num = num + old.much where id = old.gid;    end$    ③:修改一个订单,库存相应改变    #监视地点  o 表    #监视事件  update    #触发事件  update    #触发时间  after    ---被修改的数据用old来表示,old.列名引用被修改之前行中的值    ---修改之后的数据,用new来表示,new.列名引用被修改之后行中的值    create trigger tg3    after update on o    for each row    begin    update g set num = num + old.much - new.much where id = old.gid;    end$    -->当修改订单时候修改商品名称的时候代码应该 需要知道一个每个update语句的触发器只需要一个,所以我们尽量用下面这个触发器    create trigger tg4    after update on o    for each row    begin    update g set num = num + old.much where id = old.gid;    update g set num = num - new.much where id = new.gid;    end$

6).before与after的区别

After: 是先完成数据的增、删、改再触发。       触发的语句晚于监视的增、删、改。并且无法影响前面的增、删、改动作。before:是先完成触发 再增、删、改。       触发的语句先于监视的增、删、改发生。我们有机会判断、修改即将要发生的操作。假 设  :       假设商品表有商品2,数量是10;       我们往订单表插入一条记录:            insert into o        -> values        -> (1,2,20)$        select * from o$        +------+------+------+        | oid  | gid  | much |        +------+------+------+        |    1 |    2 |   20 |        +------+------+------+        会发现商品1的数量变为-10了。这就是问题的所在,因为我们之前创建的触发器是after,也就是说触发的语句是在插入订单记录之        后才执行的,这样我们就无法判断新插入订单的购买数量。        select * from g$        +------+------+------+        | id   | name | num  |        +------+------+------+        |    1 | 猪   |   22 |        |    2 | 羊   |  -10 |        |    3 | 狗   |   12 |        |    4 | 猫   |   48 |        +------+------+------+典型案例:        -->我们用一个典型案例来区分它们的区别,新建一个触发器:        -->对于所下订单进行判断,如果订单的数目大于5,就认为是恶意订单,强制把所订的商品数量改为5        #监视地点: 商品表o        #监视事件:insert        #触发时间:before        #触发事件:update        create trigger tg5        before insert on o        for each row        begin              if new.much > 5 then            set new.much = 5;             end if;             update g set num = num - new.much where id = new.gid;        end$        执行完,把之前创建的after触发器删掉,再来插入一条订单记录:        drop trigger tg1$        insert into o        -> values        -> (1,2,20)$        select * from o$        +------+------+------+        | oid  | gid  | much |        +------+------+------+        |    1 |    2 |   5  |        +------+------+------+         select * from g$        +------+------+------+        | id   | name | num  |        +------+------+------+        |    1 | 猪   |   22 |        |    2 | 羊   |   5  |        |    3 | 狗   |   13 |        |    4 | 猫   |   48 |        +------+------+------+        --执行完会发现订单记录的数量变为5,商品2的数量变为5了,就不会出现负数了。
原创粉丝点击