MySQL Trigger

2025年3月17日 | 阅读 3 分钟

MySQL 中的触发器是一组存储在系统目录中的 SQL 语句。它是一种特殊的存储过程,用于响应事件而自动调用。每个触发器都与一个表相关联,并在任何 DML 语句(如 INSERT, UPDATEDELETE)上激活。

触发器之所以被称为特殊过程,是因为它不能像存储过程那样直接调用。触发器与过程的主要区别在于,当对表执行数据修改事件时,触发器会自动调用。而存储过程则必须显式调用。

通常,根据 SQL 标准,触发器有两种类型:行级触发器和语句级触发器。

行级触发器: 它是针对触发语句(如 insert、update 或 delete)对每一行触发的触发器。例如,如果一个表插入、更新或删除了多行,行触发器将自动针对 insertupdatedelete 语句 影响的每一行触发。

语句级触发器: 它是针对发生在一个表上的每个事件仅触发一次的触发器,而无论插入、更新或删除多少行。

注意:我们应该知道 MySQL 不支持语句级触发器。它仅支持行级触发器。

为什么我们需要/使用 MySQL 中的触发器?

我们出于以下特点需要/使用 MySQL 中的触发器:

  • 触发器有助于强制执行业务规则。
  • 触发器有助于在数据插入或更新之前进行数据验证。
  • 触发器有助于记录日志,例如在表中维护审计跟踪。
  • SQL 触发器提供了一种检查数据完整性的替代方法。
  • 触发器提供了一种运行计划任务的替代方法。
  • 触发器提高了 SQL 查询的性能,因为它不需要在每次执行查询时进行编译。
  • 触发器减少了客户端代码,从而节省了时间和精力。
  • 触发器有助于我们在不同平台上扩展应用程序。
  • 触发器易于维护。

使用 MySQL 触发器的局限性

  • MySQL 触发器不允许使用所有验证;它们仅提供扩展验证。例如,我们可以使用 NOT NULL、UNIQUE、CHECK 和 FOREIGN KEY 约束进行简单验证。
  • 触发器会从客户端应用程序中不可见地调用和执行。因此,很难排除数据库层中发生的事情。
  • 触发器可能会增加数据库服务器的开销。

MySQL 中的触发器类型?

我们可以定义最多六种形式的动作或事件作为触发器:

  1. 插入前 (Before Insert) 在将数据插入表之前激活。
  2. 插入后 (After Insert) 在将数据插入表之后激活。
  3. 更新前 (Before Update) 在更新表中的数据之前激活。
  4. 更新后 (After Update) 在更新表中的数据之后激活。
  5. 删除前 (Before Delete) 在从表中删除数据之前激活。
  6. 删除后 (After Delete) 在从表中删除数据之后激活。

当我们使用不使用 INSERT、UPDATE 或 DELETE 查询来更改表中的数据时,与触发器关联的触发器将不会被调用。

命名约定

命名约定是我们为给出适当的唯一名称而遵循的一组规则。它节省了我们的时间,使工作保持条理和可理解。因此,我们必须为每个与表关联的触发器使用唯一的名称。但是,为不同表定义相同的触发器名称是一种好习惯。

MySQL 中命名触发器时应使用以下命名约定:

因此,

触发器激活时间: BEFORE | AFTER

触发器事件: INSERT | UPDATE | DELETE

如何在 MySQL 中创建触发器?

我们可以使用 CREATE TRIGGER 语句在 MySQL 中创建新触发器。下面是在 MySQL 中创建触发器的语法: