MySQL中触发器

触发器是与某个事件相关的特殊存储过程,与存储过程不一样的是,存储过程须要用 call 调用而出发器不须要使用call调用调用。spa

也就是本身预先定义好了,当某个事件发生时,就会自动出发触发器进行相关的操做。code

仅对 insert 、 update 、delete 有效,对select无。对象

五要素

trigger_name :触发器名字,其实这个为了便于对触发器的修改与删除而存在。blog

trigger_time:触发事件,在事件触发前执行仍是出发后执行。事件

tigger_action:触发的动做。io

listen_object:监听对象。模板

listen_action:监听的动做。class

下面是一个建立触发器的模板:

create trigger trigger_name  trigger_time  listen_action  ON   listen_object
FOR EACH ROW
BEGIN
    trigger_action;
ENG$

注意:因为MySQL默认的是 ; 为语句结束符,所以在这里须要修改,我修改成$:delimeter  $。object

添加订单时,库存减小

订单是原先没有的,若是触发器的事件要引用新添加的订单的信息,那么就要用 new.列明,进行引用数据。date

create trigger order_shop AFTER INSERT ON `order`
FOR EACH ROW 
BEGIN
update shop set  shop_count = shop_count-new.order_count where shop_id = new.shop_id;
END$

删除订单,库存增长

create trigger delete_order BEFORE DELETE ON `order`
FOR EACH ROW 
BEGIN
update shop set  shop_count = shop_count+OLD.order_count where shop_id = OLD.shop_id;
END$

注意:这里引用数据是使用 old.列明 ,缘由在于引用的数据是已经存在了,因此用old

修改订单 ,修改库存

create trigger change_order AFTER UPDATE ON `order`
FOR EACH ROW 
BEGIN
update shop set  shop_count = shop_count+old.order_count - new.order_count where shop_id = new.shop_id;
END$

注意:这里都用到了old和new关键字,让库存加上原来的数据再减去新数据。

查看全部的触发器:

show triggers;

触发器 after 与 before 区别

after  是 先完成数据的增删改再触发
before  是 先完成触发在再增删改。  eg:限购

例如:没人仅限购五件商品,大于5的都设为5

create trigger example_before  BEFORE INSERT ON `order`
FOR EACH ROW 
BEGIN
    IF new.order_count>5 THEN 
        SET  NEW.order_count = 5;
    END IF;
update shop set  shop_count = shop_count-new.order_count where shop_id = new.shop_id;
END$
相关文章
相关标签/搜索