MySQL 中的触发器是一组驻留在系统目录中的 SQL 语句。它是一种特殊类型的存储过程,可自动调用以响应事件。每个触发器都与一个表相关联,该表在任何 DML 语句(如INSERT、UPDATE或DELETE)上激活。
触发器称为特殊过程,因为它不能像存储过程那样直接调用。触发器和过程之间的主要区别在于,当对表进行数据修改事件时会自动调用触发器。相反,必须显式调用存储过程。
通常,触发器根据SQL标准分为两种类型:行级触发器和语句级触发器。
Row-Level Trigger:是一个触发器,通过insert、update、delete等触发语句为每一行激活。例如,如果一个表插入、更新或删除了多行,则行触发器会针对受插入、更新或删除语句影响的每一行自动触发。
Statement-Level Trigger:它是一个触发器,无论插入、更新或删除多少行,都会为表上发生的每个事件触发一次。
注意:我们应该知道 MySQL 不支持语句级触发器。它仅提供对行级触发器的支持。
为什么我们需要/使用 MySQL 中的触发器?
由于以下功能,我们需要/使用 MySQL 中的触发器:
- 触发器帮助我们执行业务规则。
- 触发器可以帮助我们在插入或更新数据之前验证数据。
- 触发器帮助我们保存记录日志,例如在表中维护审计跟踪。
- SQL 触发器提供了另一种检查数据完整性的方法。
- 触发器提供了一种运行计划任务的替代方法。
- 触发器提高了 SQL 查询的性能,因为它不需要在每次执行查询时都进行编译。
- 触发器减少了客户端代码,从而节省了时间和精力。
- 触发器帮助我们跨不同平台扩展我们的应用程序。
- 触发器易于维护。
在 MySQL 中使用触发器的限制
- MySQL 触发器不允许使用所有验证;他们只提供扩展验证。例如,我们可以使用 NOT NULL、UNIQUE、CHECK 和 FOREIGN KEY 约束进行简单的验证。
- 触发器是从客户端应用程序中隐式调用和执行的。因此,对数据库层发生的情况进行故障排除并不容易。
- 触发器可能会增加数据库服务器的开销。
MySQL 中的触发器类型?
我们可以以触发器的形式定义最多六种类型的动作或事件:
- Before Insert: 在数据插入表之前激活。
- After Insert:在表中插入数据后激活。
- 更新前:在表中数据更新前激活。
- 更新后:**表中数据更新后激活。
- 删除前:在从表中删除数据之前激活。
- 删除后:从表中删除数据后激活。
当我们使用不使用 INSERT、UPDATE 或 DELETE 查询的语句更改表中的数据时,不会调用与触发器关联的触发器。
命名约定
命名约定是我们遵循的一组规则,以提供适当的唯一名称。它可以节省我们的时间来保持工作的组织性和可理解性。因此,我们必须为每个与表关联的触发器使用唯一的名称。但是,为不同的表定义相同的触发器名称是一种很好的做法。
应使用以下命名约定来命名MySQL 中的触发器:
(BEFOR | AFTER) table_name (INSERT | UPDATE | DELETE)
因此,
触发器激活时间: BEFORE | 后
触发事件: INSERT | 更新 | 删除
如何在 MySQL 中创建触发器?
我们可以使用CREATE TRIGGER语句在 MySQL 中创建一个新的触发器。以下是在 MySQL 中创建触发器的语法:
CREATE TRIGGER trigger_name
(AFTER | BEFORE) (INSERT | UPDATE | DELETE)
ON table_name FOR EACH ROW
BEGIN
--variable declarations
--trigger code
END;