如何为同一个触发事件和动作时间创建多个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)
广告