Documentation Home
MySQL 5.7 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 35.1Mb
PDF (A4) - 35.2Mb
Man Pages (TGZ) - 256.4Kb
Man Pages (Zip) - 361.2Kb
Info (Gzip) - 3.4Mb
Info (Zip) - 3.4Mb
Excerpts from this Manual

A.5 MySQL 5.7 FAQ: Triggers

A.5.1. Where can I find the documentation for MySQL 5.7 triggers?
A.5.2. Is there a discussion forum for MySQL Triggers?
A.5.3. Does MySQL have statement-level or row-level triggers?
A.5.4. Are there any default triggers?
A.5.5. How are triggers managed in MySQL?
A.5.6. Is there a way to view all triggers in a given database?
A.5.7. Where are triggers stored?
A.5.8. Can a trigger call a stored procedure?
A.5.9. Can triggers access tables?
A.5.10. Can a table have multiple triggers with the same trigger event and action time?
A.5.11. Is it possible for a trigger to update tables on a remote server?
A.5.12. Do triggers work with replication?
A.5.13. How are actions carried out through triggers on a source replicated to a replica?

A.5.1.

Where can I find the documentation for MySQL 5.7 triggers?

SeeSection 23.3, “Using Triggers”.

A.5.2.

Is there a discussion forum for MySQL Triggers?

Yes. It is available athttps://forums.mysql.com/list.php?99.

A.5.3.

Does MySQL have statement-level or row-level triggers?

All triggers areFOR EACH ROW; that is, the trigger is activated for each row that is inserted, updated, or deleted. MySQL does not support triggers usingFOR EACH STATEMENT.

A.5.4.

Are there any default triggers?

Not explicitly. MySQL does have specific special behavior for someTIMESTAMP columns, as well as for columns which are defined usingAUTO_INCREMENT.

A.5.5.

How are triggers managed in MySQL?

Triggers can be created using theCREATE TRIGGER statement, and dropped usingDROP TRIGGER. SeeSection 13.1.20, “CREATE TRIGGER Statement”, andSection 13.1.31, “DROP TRIGGER Statement”, for more about these statements.

Information about triggers can be obtained by querying theINFORMATION_SCHEMA.TRIGGERS table. SeeSection 24.3.29, “The INFORMATION_SCHEMA TRIGGERS Table”.

A.5.6.

Is there a way to view all triggers in a given database?

Yes. You can obtain a listing of all triggers defined on databasedbname using a query on theINFORMATION_SCHEMA.TRIGGERS table such as the one shown here:

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

For more information about this table, seeSection 24.3.29, “The INFORMATION_SCHEMA TRIGGERS Table”.

You can also use theSHOW TRIGGERS statement, which is specific to MySQL. SeeSection 13.7.5.38, “SHOW TRIGGERS Statement”.

A.5.7.

Where are triggers stored?

Triggers are stored in.TRG files, with one such file one per table.

A.5.8.

Can a trigger call a stored procedure?

Yes.

A.5.9.

Can triggers access tables?

A trigger can access both old and new data in its own table. A trigger can also affect other tables, but it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.

A.5.10.

Can a table have multiple triggers with the same trigger event and action time?

It is possible to define multiple triggers for a given table that have the same trigger event and action time. For example, you can have twoBEFORE UPDATE triggers for a table. By default, triggers that have the same trigger event and action time activate in the order they were created. To affect trigger order, specify a clause afterFOR EACH ROW that indicatesFOLLOWS orPRECEDES and the name of an existing trigger that also has the same trigger event and action time. WithFOLLOWS, the new trigger activates after the existing trigger. WithPRECEDES, the new trigger activates before the existing trigger.

A.5.11.

Is it possible for a trigger to update tables on a remote server?

Yes. A table on a remote server could be updated using theFEDERATED storage engine. (SeeSection 15.8, “The FEDERATED Storage Engine”).

A.5.12.

Do triggers work with replication?

Yes. However, the way in which they work depends whether you are using MySQL'sclassic statement-based or row-based replication format.

When using statement-based replication, triggers on the replica are executed by statements that are executed on the source (and replicated to the replica).

When using row-based replication, triggers are not executed on the replica due to statements that were run on the source and then replicated to the replica. Instead, when using row-based replication, the changes caused by executing the trigger on the source are applied on the replica.

For more information, seeSection 16.4.1.34, “Replication and Triggers”.

A.5.13.

How are actions carried out through triggers on a source replicated to a replica?

Again, this depends on whether you are using statement-based or row-based replication.

Statement-based replication.  First, the triggers that exist on a source must be re-created on the replica server. Once this is done, the replication flow works as any other standard DML statement that participates in replication. For example, consider a tableEMP that has anAFTER insert trigger, which exists on a replication source server. The sameEMP table andAFTER insert trigger exist on the replica server as well. The replication flow would be:

  1. AnINSERT statement is made toEMP.

  2. TheAFTER trigger onEMP activates.

  3. TheINSERT statement is written to the binary log.

  4. The replica picks up theINSERT statement toEMP and executes it.

  5. TheAFTER trigger onEMP that exists on the replica activates.

Row-based replication.  When you use row-based replication, the changes caused by executing the trigger on the source are applied on the replica. However, the triggers themselves are not actually executed on the replica under row-based replication. This is because, if both the source and the replica applied the changes from the source and, in addition, the trigger causing these changes were applied on the replica, the changes would in effect be applied twice on the replica, leading to different data on the source and the replica.

In most cases, the outcome is the same for both row-based and statement-based replication. However, if you use different triggers on the source and replica, you cannot use row-based replication. (This is because the row-based format replicates the changes made by triggers executing on the source to the replicas, rather than the statements that caused the triggers to execute, and the corresponding triggers on the replica are not executed.) Instead, any statements causing such triggers to be executed must be replicated using statement-based replication.

For more information, seeSection 16.4.1.34, “Replication and Triggers”.