一、創建觸發器
觸發器(TRIGGER)是由 INSERT、UPDATE 和 DELETE 等事件來觸發某種特定操作。滿足觸發器的觸發條件時,數據庫系統就會執行觸發器中定義的程序語句。這樣可以保證某些操作之間的一致性。
1、創建只有一個執行語句的觸發器,基本形式如下:
CREATE TRIGGER 觸發器名 BEFORE | AFTER 觸發事件
ON 表名 FOR EACH ROW 執行語句
其中,觸發器名 參數指要創建的觸發器的名字;BEFORE 和 AFTER 參數指定觸發器執行的時間,BEFORE 指在觸發事件之前執行觸發語句,AFTER 指在觸發事件之后執行觸發語句; 觸發事件 參數指觸發的條件,其中包括 INSERT、UPDATE 和 DELETE;表名 參數指觸發事件操作的表的名稱;FOR EACH ROW 表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器;執行語句 參數 指觸發器被觸發后執行的程序。
mysql> CREATE TRIGGER dept_trig1 BEFORE INSERT
-> ON department FOR EACH ROW
-> INSERT INTO triger_time VALUES(NOW());
說明:當向department 表中執行INSERT 操作時,數據庫系統都會在 INSERT 語句執行之前向 triger_time 表中插入當前時間。
2、創建有多個執行語句的觸發器,基本形式如下:
CREATE TRIGGER 觸發器名 BEFORE | AFTER 觸發事件
ON 表名 FOR EACH ROW
BEGIN
執行語句列表
END
其中,BEGIN 與 END 中間的 執行語句列表 參數表示需要執行的多個執行語句的內容。不同的執行語句之間用分號隔開。
一般情況下MySQL默認是以";"(分號)作為結束執行語句。在創建觸發器過程中需要用到分號,為了解決這個問題,可以用DELIMITER 語句。如下:
mysql> DELIMITER &&
mysql> CREATE TRIGGER dept_trig2 AFTER DELETE
-> ON department FOR EACH ROW
-> BEGIN
-> INSERT INTO trigger_time VALUES('21:01:01');
-> INSERT INTO trigger_time VALUES('22:01:01');
-> END
-> &&
二、查看觸發器
查看觸發器是指查看數據庫中已存在的觸發器的定義、狀態和語法等信息。查看觸發器的方法包括 SHOW TRIGGERS 語句和查詢 information_schma 數據庫下的 triggers 表等。
mysql> SHOW TRIGGERS \G 查詢所有觸發器的信息,不能查詢指定的觸發器
mysql> SELECT * FROM information_schema.triggers \G 查詢tiggers中的信息,會顯示所有觸發器的詳細信息
mysql> SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='dept_trig1' \G 只查詢dept_trig1觸發器的詳細信息。
三、觸發器的使用
在MySQL中,觸發器執行的順序是 BEFORE 觸發器、表操作(INSERT、UPDATE 和 DELETE) 和 AFTER 觸發器。
在department 表上創建BEFORE INSERT 和 AFTER INSERT 這兩個觸發器。
mysql> CREATE TRIGGER before_insert BEFORE INSERT
-> ON department FOR EACH ROW
-> INSERT INTO trigger_test VALUES(null,"before_insert"); 創建BEFORE INSERT 觸發器
mysql> CREATE TRIGGER after_insert AFTER INSERT
-> ON department FOR EACH ROW
-> INSERT INTO trigger_test VALUES(null,"after_insert"); 創建AFTER INSERT 觸發器
mysql> INSERT INTO department VALUES(1003,'HAOHOA','HELLO','YES'); 向department插入一條記錄用來實驗前面兩個觸發器的動作先后順序。
mysql> SELECT * FROM trigger_test; 可以查看到BEFORE INSERT 先於AFTER INSERT動作
+----+---------------+
| id | info |
+----+---------------+
| 1 | before_insert |
| 2 | after_insert |
+----+---------------+
1 row in set (0.00 sec)
四、刪除觸發器
刪除觸發器指刪除數據庫中已經存在的觸發器。基本形式如下:
DROP TRIGGER 觸發器名 | 數據庫名.觸發器名;
其中,觸發器名 參數指要刪除的觸發器的名稱。如果只指定觸發器名稱,數據庫系統會在當前數據庫下查找該觸發器,如果找到就刪除。 觸發器名 | 數據庫名.觸發器名 表示兩者選其中一個。不再需要的觸發器一定要刪除掉。
mysql> DROP TRIGGER test2.dept_trig1; 指定刪除數據庫test2下的觸發器dept_trig1,如果不指定數據庫test2,則刪除當前數據庫下的觸發器dept_trig1。