如何為同一個觸發事件和動作時間建立多個MySQL觸發器?
MySQL 5.7.2+允許我們在同一個表中為同一個事件和動作時間建立多個觸發器。當事件發生時,這兩個觸發器將依次啟用。可以透過一個例子來理解:
示例
在這個例子中,我們為同一個事件(例如BEFORE UPDATE)建立多個觸發器。觸發器的名稱為“Studentdetail_before_update”和“Studentdetail_before_update2”。當事件發生時,它們將依次啟用。我們在名為“Student_detail”的表上建立這些觸發器,該表包含以下資料:
mysql> Select * from Student_detail; +-----------+-------------+------------+ | Studentid | StudentName | address | +-----------+-------------+------------+ | 100 | Gaurav | Delhi | | 101 | Raman | Shimla | | 103 | Rahul | Jaipur | | 104 | Ram | Chandigarh | | 105 | Mohan | Chandigarh | +-----------+-------------+------------+ 5 rows in set (0.06 sec) mysql> Delimiter //
現在,藉助以下查詢,我們將建立第一個觸發器,其建立方式與之前的相同。
mysql> Create Trigger studentdetail_before_update -> BEFORE UPDATE -> ON Student_detail -> FOR EACH ROW -> BEGIN -> DECLARE AUSER Varchar(40); -> SELECT USER() into AUSER; ->INSERT INTO Student_detail_updated(studentid, Updated_date,Updated_by) values(OLD.studentid,NOW(),AUSER); -> END; // Query OK, 0 rows affected (0.17 sec) mysql> Update student_detail SET Address = 'Ludhiana' Where studentName = 'Ram'; Query OK, 1 row affected (0.15 sec) Rows matched: 1 Changed: 1 Warnings: 0
呼叫上述建立的觸發器後,我們得到以下結果:
mysql> Select * from student_detail_updated; +-----------+---------------------+----------------+ | studentid | Updated_date | Updated_by | +-----------+---------------------+----------------+ | 104 | 2017-11-22 16:17:16 | root@localhost | +-----------+---------------------+----------------+ 1 row in set (0.00 sec)
現在,可以建立同一個事件和動作時間的第二個觸發器,如下所示:
mysql> Create Trigger studentdetail_before_update2 -> BEFORE UPDATE -> ON Student_detail -> FOR EACH ROW FOLLOWS studentdetail_before_update -> BEGIN -> DECLARE AUSER Varchar(40); -> SELECT USER() into AUSER; -> INSERT INTO Student_detail_updated(studentid, Updated_date,Updated_by) values(OLD.studentid,NOW(),AUSER); -> END; // Query OK, 0 rows affected (0.15 sec)
由於我們使用了關鍵字“FOLLOWS”,因此上述觸發器將在第一個觸發器之後啟用。
mysql> Update Student_detail SET Address = 'Patiala' WHERE studentname = 'Mohan'; Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
現在,當我們更新值時,結果集將顯示同一事件和動作時間的兩行。第二行表示studentdetail_before_update觸發器後的值,第三行表示studentdetail_before_update2觸發器後的值。
mysql> Select * from student_detail_updated; +-----------+---------------------+----------------+ | studentid | Updated_date | Updated_by | +-----------+---------------------+----------------+ | 104 | 2017-11-22 16:17:16 | root@localhost | | 105 | 2017-11-22 16:19:28 | root@localhost | | 105 | 2017-11-22 16:19:28 | root@localhost | +-----------+---------------------+----------------+ 3 rows in set (0.00 sec)
廣告