自動目錄
trigger 在資料庫的使用上,具有極大的方便性。MySQL 在5.02 後支援了 trigger 的指令。
建立 trigger
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
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下操作):
DELIMITER | (這裡很重要,如果不修改預設的 ;,則後面會出錯) CREATE TRIGGER `insertrow` BEFORE INSERT ON `logs` FOR EACH ROW BEGIN UPDATE `summary` SET `value` = `value` +1 WHERE `ky` = 'rownum'; END | DELIMITER ; (把結束符號修改回去)
查看trigger 內容
mysql> show triggers;
+-----------+--------+-------+----------------------------------------------------------------------------
| Trigger | Event | Table | Statement
+-----------+--------+-------+----------------------------------------------------------------------------
| insertrow | INSERT | logs | BEGIN UPDATE `summary` SET `value` = `value` +1 WHERE `ky` = 'rownum'; END
+-----------+--------+-------+----------------------------------------------------------------------------
+--------+---------+----------+----------------+
| Timing | Created | sql_mode | Definer |
+--------+---------+----------+----------------+
| BEFORE | NULL | | axer@localhost |
+--------+---------+----------+----------------+
刪除trigger
mysql> drop TRIGGER insertrow;
範例:
在刪除記錄時,把資料行備份到另一個資料表
mysql> CREATE TRIGGER TR_A_DEL_INNMSGREPLY_TABLE AFTER DELETE ON source_tbl FOR EACH ROW BEGIN INSERT IGNORE INTO target_tbl( sn, fsn, author, o, `desc`,cDT ) VALUES ( old.sn, old.fsn, old.author, old.o, old.desc, old.cDT); END$$
mysql> DELIMITER ;
再次提醒,不要phpMyAdmin下操作,你不會成功。
2016.1.23更新
在phpmyadmin4版後可以直接操作了,有一個觸發器,選擇資料庫後有一個「觸發器的頁籤,可以直接設定
各位可以試試
參考資料
[1] Mysql 5.1 doc 中文 http://twpug.net/docs/mysql-5.1/triggers.html
原文 2010-09-10 15:12:12