触发器是与某个事件相关的特殊存储过程,与存储过程不同的是,存储过程需要用 call 调用而出发器不需要使用call调用调用。
也就是自己预先定义好了,当某个事件发生时,就会自动出发触发器进行相关的操作。
仅对 insert 、 update 、delete 有效,对select无。
五要素
trigger_name :触发器名字,其实这个为了便于对触发器的修改与删除而存在。
trigger_time:触发事件,在事件触发前执行还是出发后执行。
tigger_action:触发的动作。
listen_object:监听对象。
listen_action:监听的动作。
下面是一个创建触发器的模板:
create trigger trigger_name trigger_time listen_action ON listen_object
FOR EACH ROW
BEGIN
trigger_action;
ENG$
注意:由于MySQL默认的是 ; 为语句结束符,因此在这里需要修改,我修改为$:delimeter $。
添加订单时,库存减少
订单是原先没有的,如果触发器的事件要引用新添加的订单的信息,那么就要用 new.列明,进行引用数据。
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$