觸發器是與某個事件相關的特殊存儲過程,與存儲過程不一樣的是,存儲過程須要用 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 是 先完成觸發在再增刪改。 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$