Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

A.5 MySQL 8.3 FAQ:触发器

A.5.1. 在哪里可以找到 MySQL 8.3 触发器的文档?
A.5.2. 是否有 MySQL 触发器讨论论坛?
A.5.3. MySQL 8.3 是否具有语句级或行级触发器?
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. 触发器在源上执行的操作如何在副本上复制?
(No translation needed, as this is just HTML code without any translatable text.)

A.5.1.

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

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

A.5.2.

是否有 MySQL 触发器讨论论坛?

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

A.5.3.

MySQL 8.3 是否具有语句级或行级触发器?

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

A.5.4.

是否有默认触发器?

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

A.5.5.

MySQL 中如何管理触发器?

在 MySQL 8.3 中,可以使用 CREATE TRIGGER 语句创建触发器,并使用 DROP TRIGGER 语句删除触发器。请参阅 第 15.1.22 节,“CREATE TRIGGER 语句”第 15.1.34 节,“DROP TRIGGER 语句”

可以通过查询 INFORMATION_SCHEMA.TRIGGERS 表来获取触发器信息。请参阅 第 28.3.45 节,“INFORMATION_SCHEMA TRIGGERS 表”

A.5.6.

是否可以查看给定数据库中的所有触发器?

是的。可以使用以下查询来获取数据库 dbname 中的所有触发器列表:

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

请参阅 第 28.3.45 节,“INFORMATION_SCHEMA TRIGGERS 表”

也可以使用 SHOW TRIGGERS 语句,该语句是 MySQL 特有的。请参阅 第 15.7.7.42 节,“SHOW TRIGGERS 语句”

A.5.7.

触发器存储在哪里?

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

A.5.8.

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

是的。

A.5.9.

触发器是否可以访问表?

触发器可以访问自己的表中的旧数据和新数据。触发器也可以影响其他表,但是它不能修改已经被语句或函数所使用的表(用于读取或写入)。

A.5.10.

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

在 MySQL 8.3 中,可以为给定表定义多个触发器,这些触发器具有相同的触发事件和操作时间。例如,可以为一个表定义两个 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. 副本服务器上的 EMPAFTER 触发器激活。

基于行的复制。 当您使用基于行的复制时,源服务器上触发器执行的更改将被应用于副本服务器上。然而,在基于行的复制下,触发器本身不会在副本服务器上执行。这是因为,如果源服务器和副本服务器都应用了源服务器上的更改,并且触发器也在副本服务器上执行,那么更改将在副本服务器上被应用两次,导致源服务器和副本服务器上的数据不同。

在大多数情况下,基于行的复制和基于语句的复制的结果相同。然而,如果您在源服务器和副本服务器上使用不同的触发器,那么您不能使用基于行的复制。(这是因为基于行的格式将源服务器上触发器执行的更改复制到副本服务器上,而不是触发器执行的语句,而副本服务器上的相应触发器不会被执行。)相反,导致触发器执行的语句必须使用基于语句的复制。

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