如何為同一個觸發事件和觸發時間建立多個 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)

更新於: 2020-06-22

595 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.