文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  MySQL 8.4 常见问题解答  /  MySQL 8.4 常见问题解答:触发器

A.5 MySQL 8.4 常见问题解答:触发器

A.5.1. 在哪里可以找到 MySQL 8.4 触发器的文档?
A.5.2. 有没有关于 MySQL 触发器的讨论论坛?
A.5.3. MySQL 有语句级或行级触发器吗?
A.5.4. 有默认触发器吗?
A.5.5. MySQL 如何管理触发器?
A.5.6. 有没有办法查看给定数据库中的所有触发器?
A.5.7. 触发器存储在哪里?
A.5.8. 触发器可以调用存储过程吗?
A.5.9. 触发器可以访问表吗?
A.5.10. 一个表可以有多个具有相同触发器事件和操作时间的触发器吗?
A.5.11. 触发器可以更新远程服务器上的表吗?
A.5.12. 触发器是否与复制一起使用?
A.5.13. 触发器在源复制到副本上的操作是如何执行的?

A.5.1.

在哪里可以找到 MySQL 8.4 触发器的文档?

请参见 第 27.3 节,“使用触发器”.

A.5.2.

有没有关于 MySQL 触发器的讨论论坛?

是的。它位于 https://forums.mysql.com/list.php?99.

A.5.3.

MySQL 有语句级或行级触发器吗?

所有触发器都是 FOR EACH ROW;也就是说,触发器会为插入、更新或删除的每一行激活。MySQL 不支持使用 FOR EACH STATEMENT 的触发器。

A.5.4.

有默认触发器吗?

没有明确的。MySQL 对某些 TIMESTAMP 列以及使用 AUTO_INCREMENT 定义的列具有特定的特殊行为。

A.5.5.

MySQL 如何管理触发器?

可以使用 CREATE TRIGGER 语句创建触发器,并使用 DROP TRIGGER 删除触发器。有关这些语句的更多信息,请参见 第 15.1.22 节,“CREATE TRIGGER 语句”第 15.1.34 节,“DROP TRIGGER 语句”.

有关触发器的信息可以通过查询 INFORMATION_SCHEMA.TRIGGERS 表获得。有关此表的更多信息,请参见 第 28.3.44 节,“INFORMATION_SCHEMA TRIGGERS 表”.

A.5.6.

有没有办法查看给定数据库中的所有触发器?

是的。可以使用 INFORMATION_SCHEMA.TRIGGERS 表上的查询来获取在数据库 dbname 上定义的所有触发器的列表,例如这里所示的列表

SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_STATEMENT
    FROM INFORMATION_SCHEMA.TRIGGERS
    WHERE TRIGGER_SCHEMA='dbname';

有关此表的更多信息,请参见 第 28.3.44 节,“INFORMATION_SCHEMA TRIGGERS 表”.

还可以使用特定于 MySQL 的 SHOW TRIGGERS 语句。请参见 第 15.7.7.39 节,“SHOW TRIGGERS 语句”.

A.5.7.

触发器存储在哪里?

触发器存储在 mysql.triggers 系统表中,它是数据字典的一部分。

A.5.8.

触发器可以调用存储过程吗?

是的。

A.5.9.

触发器可以访问表吗?

触发器可以访问其自身表中的旧数据和新数据。触发器还可以影响其他表,但不能修改正在被调用函数或触发器的语句使用(用于读写)的表。

A.5.10.

一个表可以有多个具有相同触发器事件和操作时间的触发器吗?

在 MySQL 8.4 中,可以为给定表定义多个具有相同触发器事件和操作时间的触发器。例如,可以为一个表创建两个 BEFORE UPDATE 触发器。默认情况下,具有相同触发器事件和操作时间的触发器会按创建顺序激活。要影响触发器顺序,请在 FOR EACH ROW 之后指定一个子句,该子句指示 FOLLOWSPRECEDES 以及具有相同触发器事件和操作时间的现有触发器的名称。使用 FOLLOWS,新触发器将在现有触发器之后激活。使用 PRECEDES,新触发器将在现有触发器之前激活。

A.5.11.

触发器可以更新远程服务器上的表吗?

是的。可以使用 FEDERATED 存储引擎更新远程服务器上的表。(请参见 第 18.8 节,“FEDERATED 存储引擎”)。

A.5.12.

触发器是否与复制一起使用?

是的。但是,它们的工作方式取决于您是使用 MySQL 的 经典 语句级复制格式还是基于行的复制格式。

使用语句级复制时,副本上的触发器会由在源(并复制到副本)上执行的语句执行。

使用基于行的复制时,副本上的触发器不会由在源上运行并随后复制到副本的语句执行。相反,使用基于行的复制时,在源上执行触发器导致的更改将应用于副本。

有关更多信息,请参见 第 19.5.1.36 节,“复制和触发器”.

A.5.13.

触发器在源复制到副本上的操作是如何执行的?

同样,这取决于您是使用语句级复制还是基于行的复制。

语句级复制。 首先,必须在副本服务器上重新创建存在于源上的触发器。完成此操作后,复制流程的工作方式与参与复制的任何其他标准 DML 语句相同。例如,考虑一个名为 EMP 的表,它具有一个 AFTER 插入触发器,该触发器存在于复制源服务器上。相同的 EMP 表和 AFTER 插入触发器也存在于副本服务器上。复制流程将是

  1. EMP 进行 INSERT 语句。

  2. EMP 上的 AFTER 触发器激活。

  3. INSERT 语句写入二进制日志。

  4. 副本接收对 EMPINSERT 语句并执行它。

  5. 副本上存在的 EMP 上的 AFTER 触发器激活。

基于行的复制。 使用基于行的复制时,在源上执行触发器导致的更改将应用于副本。但是,触发器本身实际上不会在基于行的复制下在副本上执行。这是因为,如果源和副本都应用了来自源的更改,并且此外,在副本上应用了导致这些更改的触发器,那么这些更改实际上将在副本上应用两次,从而导致源和副本上的数据不同。

在大多数情况下,基于行的复制和语句级复制的结果相同。但是,如果您在源和副本上使用不同的触发器,则不能使用基于行的复制。(这是因为基于行的格式将源上执行触发器所做的更改复制到副本,而不是导致触发器执行的语句,而副本上的相应触发器不会执行。)相反,导致这些触发器执行的任何语句都必须使用语句级复制进行复制。

有关更多信息,请参见 第 19.5.1.36 节,“复制和触发器”.