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$
相關文章
相關標籤/搜索