文档主页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (美国信纸) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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

A.5.1. 在哪里可以找到 MySQL 9.0 触发器的文档?
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 9.0 触发器的文档?

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

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 表”.

您也可以使用 SHOW TRIGGERS 语句,该语句是特定于 MySQL 的。参见 第 15.7.7.39 节,“SHOW TRIGGERS 语句”.

A.5.7.

触发器存储在哪里?

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

A.5.8.

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

是的。

A.5.9.

触发器可以访问表吗?

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

A.5.10.

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

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

A.5.11.

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

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

A.5.12.

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

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

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

使用行级复制时,触发器不会在副本上执行,这是因为这些语句是在源上运行,然后复制到副本。相反,使用行级复制时,在源上执行触发器所导致的更改会应用在副本上。

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

A.5.13.

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

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

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

  1. EMP 执行一个 INSERT 语句。

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

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

  4. 副本获取对 EMPINSERT 语句并执行它。

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

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

在大多数情况下,行级复制和语句级复制的结果相同。但是,如果在源和副本上使用不同的触发器,则不能使用行级复制。(这是因为行级格式会将由在源上执行的触发器引起的更改复制到副本,而不是导致触发器执行的语句,以及副本上的相应触发器不会执行。)相反,任何导致此类触发器执行的语句都必须使用语句级复制来复制。

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