> For the complete documentation index, see [llms.txt](https://hezhiqiang-book.gitbook.io/mysql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hezhiqiang-book.gitbook.io/mysql/di-si-zhang/shi-xian.md).

# 实现

在本教程中，您将了解MySQL触发器实现。另外，我们将向展示MySQL如何将触发器和触发器的限制存储在MySQL中。

## MySQL触发器简介

在MySQL中，触发器是一组SQL语句，当对相关联的表上的数据进行更改时，会自动调用该语句。 触发器可以被定义为在[INSERT](http://www.yiibai.com/mysql/insert-statement.html)，[UPDATE](http://www.yiibai.com/mysql/update-data.html)或[DELETE](http://www.yiibai.com/mysql/delete-statement.html)语句更改数据之前或之后调用。在*MySQL5.7.2*版本之前，每个表最多可以定义六个触发器。

* `BEFORE INSERT` - 在数据插入表之前被激活触发器。
* `AFTER INSERT` - 在将数据插入表之后激活触发器。
* `BEFORE UPDATE` - 在表中的数据更新之前激活触发器。
* `AFTER UPDATE` - 在表中的数据更新之后激活触发器。
* `BEFORE DELETE` - 在从表中删除数据之前激活触发器。
* `AFTER DELETE` - 从表中删除数据之后激活触发器。

但是，从*MySQL 5.7.2+*&#x7248;本开始，可以[为相同的触发事件和动作时间定义多个触发器](http://www.yiibai.com/mysql/triggers-create-multiple-triggers-for-the-same-trigger-event-and-action-time.html)。

当使用不使用`INSERT`，`DELETE`或`UPDATE`语句更改表中数据的语句时，不会调用与表关联的触发器。 例如，[TRUNCATE](http://www.yiibai.com/mysql/truncate-table.html)语句删除表的所有数据，但不调用与该表相关联的触发器。

有些语句使用了后台的`INSERT`语句，如[REPLACE语句](http://www.yiibai.com/mysql/replace.html)或[LOAD DATA语句](http://www.yiibai.com/mysql/import-csv-file-mysql-table.html)。如果使用这些语句，则调用与表关联的相应触发器。

必须要为与表相关联的每个触发器使用唯一的名称。可以为不同的表定义相同的触发器名称，这是一个很好的做法。

应该使用以下命名约定命名触发器：

```sql
(BEFORE | AFTER)_tableName_(INSERT| UPDATE | DELETE)
```

例如，`before_order_update`是更新`orders`表中的行数据之前调用的触发器。

以下命名约定与上述一样。

```sql
tablename_(BEFORE | AFTER)_(INSERT| UPDATE | DELETE)
```

例如，`order_before_update`与上述`before_order_update`触发器相同。

## MySQL触发存储

MySQL在数据目录中存储触发器，例如：`/data/yiibaidb/`,并使用名为`tablename.TRG`和`triggername.TRN`的文件：

* `tablename.TRG`文件将触发器映射到相应的表。
* `triggername.TRN`文件包含触发器定义。

可以通过将触发器文件复制到备份文件夹来备份MySQL触发器。也可以[使用mysqldump工具备份触发器](http://www.yiibai.com/mysql/how-to-backup-database-using-mysqldump.html)。

## MySQL触发限制

MySQL触发器覆盖标准SQL中定义的所有功能。 但是，在应用程序中使用它们之前，您应该知道一些限制。

**MySQL触发器不能：**

* 使用在`SHOW`，`LOAD DATA`，`LOAD TABLE`，[BACKUP DATABASE](http://www.mysqltutorial.org/mysql/how-to-backup-database-using-mysqldump.aspx)，`RESTORE`，`FLUSH`和`RETURN`语句之上。
* 使用隐式或明确提交或回滚的语句，如`COMMIT`，`ROLLBACK`，`START TRANSACTION`，[LOCK/UNLOCK TABLES](http://www.mysqltutorial.org/mysql-table-locking.html)，`ALTER`，`CREATE`，`DROP`，[RENAME](http://www.mysqltutorial.org/mysql-rename-table.html)等。
* 使用[准备语句](http://www.mysqltutorial.org/mysql-prepared-statement.aspx)，如`PREPARE`，`EXECUTE`等
* 使用动态SQL语句。

从*MySQL 5.1.4*版本开始，触发器可以调用[存储过程](http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx)或存储函数，在这之前的版本是有所限制的。

在本教程中，我们向您展示了如何在MySQL中实现触发器。我们还讨论了触发器的存储以及触发器在MySQL中的局限性。
