摘要:在本教程中,您将了解MySQL 触发器的实现。另外,我们还将向您展示MySQL如何存储触发器以及MySQL中触发器的限制。
MySQL触发器简介
在 MySQL 中,触发器是一组 SQL 语句,当关联表上的数据发生更改时,会自动调用该语句。触发器可以定义为在INSERT 、 UPDATE或DELETE语句更改数据之前或之后调用。在 MySQL 5.7.2 版本之前,您可以为每个表最多定义 6 个触发器。
BEFORE INSERT
– 在数据插入表之前激活。-
AFTER INSERT
– 在数据插入表后激活。 -
BEFORE UPDATE
– 在更新表中的数据之前激活。 -
AFTER UPDATE
– 在表中的数据更新后激活。 -
BEFORE DELETE
– 在从表中删除数据之前激活。 -
AFTER DELETE
– 从表中删除数据后激活。
但是,从MySQL版本5.7.2+开始,您可以为同一触发事件和动作时间定义多个触发器。
当您使用不使用INSERT
、 DELETE
或UPDATE
语句的语句来更改表中的数据时,不会调用与该表关联的触发器。例如, TRUNCATE语句删除表的所有数据,但不调用与该表关联的触发器。
有一些语句在幕后使用INSERT
语句,例如REPLACE 语句或LOAD DATA语句。如果使用这些语句,则会调用与该表关联的相应触发器。
您必须为与表关联的每个触发器使用唯一的名称。但是,您可以为不同的表定义相同的触发器名称,尽管这是一个很好的做法。
您应该使用以下命名约定来命名触发器:
(BEFORE | AFTER)_tableName_(INSERT| UPDATE | DELETE)
Code language: SQL (Structured Query Language) (sql)
例如, before_order_update
是在更新order
表中的行之前调用的触发器。
下面的命名约定与上面的一样好。
tablename_(BEFORE | AFTER)_(INSERT| UPDATE | DELETE)
Code language: SQL (Structured Query Language) (sql)
例如, order_before_update
与上面的before_order_update
触发器相同。
MySQL 触发器存储
MySQL 将触发器存储在数据目录中,例如/data/classicmodels/
,其中文件名为tablename.TRG
和triggername.TRN
:
tablename.TRG
文件将触发器映射到相应的表。-
triggername.TRN
文件包含触发器定义。
您可以通过将触发器文件复制到备份文件夹来备份 MySQL 触发器。您还可以使用mysqldump工具备份触发器。
MySQL 触发器限制
MySQL 触发器涵盖了标准 SQL 中定义的所有功能。但是,在您的应用程序中使用它们之前,您应该了解一些限制。
MySQL 触发器不能:
- 使用
SHOW
、LOAD DATA
、LOAD TABLE
、 BACKUP DATABASE 、RESTORE
、FLUSH
和RETURN
语句。 - 使用隐式或显式提交或回滚的语句,例如COMMIT 、 ROLLBACK 、 START TRANSACTION 、 LOCK/UNLOCK TABLES 、 ALTER 、 CREATE 、 DROP 、 RENAME 。
- 使用准备好的语句,例如
PREPARE
和EXECUTE
。 - 使用动态 SQL 语句。
从MySQL 5.1.4版本开始,触发器可以调用存储过程或存储函数,这是以前版本的限制。
在本教程中,我们向您展示了如何在 MySQL 中实现触发器。我们还讨论了触发器的存储以及触发器在 MySQL 中的限制。