Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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 表来获取某个数据库中的所有触发器列表,例如:

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

更多信息,请参阅 第 28.3.44 节,“INFORMATION_SCHEMA.TRIGGERS 表”

也可以使用 SHOW TRIGGERS 语句,该语句是 MySQL 特有的。请参阅 第 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 插入触发器,该触发器也存在于副本服务器上。复制流程将是:

  1. EMP 执行 INSERT 语句。

  2. EMP 的 AFTER 触发器激活。

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

  4. 副本从二进制日志中获取 INSERT 语句,并执行它。

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

基于行的复制.  使用基于行的复制时,源上执行触发器所引起的变化将被应用于副本上。然而,在基于行的复制中,触发器本身不会在副本上执行。这是因为,如果源和副本都应用了源上的变化,并且在副本上执行了触发器,变化将被应用两次,导致源和副本上的数据不同。

在大多数情况下,基于行的复制和基于语句的复制的结果相同。但是,如果您在源和副本上使用不同的触发器,不能使用基于行的复制。(这是因为基于行的格式将源上的触发器所引起的变化复制到副本上,而不是执行触发器的语句,并且副本上的相应触发器不会被执行。)相反,任何导致触发器执行的语句必须使用基于语句的复制。

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