2015年10月8日 星期四

Trigger

Mysql 的 Trigger 觸發

trigger_name 觸發名稱
                     隨個人喜好命名

trigger_time 觸發時間 
                     只有 BEFORE 和AFTER兩種
                     BEFORE 是在進行trigger_event 之前
                     AFTER 在進行trigger_event 之後觸發

trigger_event 觸發事件
                     有 INSERT、DELETE、UPDATE 三種


以下有幾個注意點:

    1. INSERT INTO .. ON DUPLICATE UPDATE 
                     這語法造成的觸發行為由最後是 INSERT 或是 UPDATE 來決定
    2. 同一個 trigger_time +trigger_event  組合不得重覆。
    3. INSERT、LOAD DATA和REPLACE 都會觸發 INSERT event
        DELETE和REPLACE 都會觸發 DELETE。


trigger_stmt 是當觸發時要執行的語句。
如果您打算執行多個語句,可使用BEGIN ... END復合語句結構。
以下是範例(直接在Mysql console下指令,不要phpMyAdmin下操作):

DROP PROCEDURE IF EXISTS update_testTable ;

delimiter //
CREATE PROCEDURE update_testTable ( IN id varchar(32)) 
BEGIN 

   DELETE c
   FROM a
   WHERE a.id = id ;

   INSERT INTO a (  id )
                    value ( id ) ;

END //
delimiter ;  
delimiter //

DROP TRIGGER IF EXISTS trigger_INSERT_testTable ;

CREATE TRIGGER trigger_INSERT_testTable
AFTER INSERT ON testTable
FOR EACH ROW  
        BEGIN  
            CALL update_testTable (NEW.id
END //
delimiter ;   
delimiter //

DROP TRIGGER IF EXISTS trigger_UPDATE_testTable ;

CREATE TRIGGER trigger_UPDATE_testTable
AFTER INSERT ON testTable
FOR EACH ROW  
        BEGIN  
            CALL update_testTable (NEW.id
END //
delimiter ;   
delimiter //

DROP TRIGGER IF EXISTS trigger_DELETE_testTable ;

CREATE TRIGGER trigger_DELETE_testTable
AFTER INSERT ON testTable
FOR EACH ROW  
        BEGIN  
            CALL update_testTable (OLD.id
END //
delimiter ; 
delimiter //



查看trigger 內容
mysql> show triggers;


刪除trigger 
mysql> drop TRIGGER trigger_name;

沒有留言:

張貼留言