MySQL 触发器
MySQL中的触发器是在系统目录中驻留的一组SQL语句。 这是一种特殊类型的存储过程,它会自动在响应事件时被调用 。每个触发器与一个表相关联,它在任何DML语句(如 INSERT,UPDATE 或 DELETE )被执行时被激活。
触发器被称为特殊过程,是因为它不能像存储过程那样直接调用。触发器和存储过程的主要区别在于,当针对表进行数据修改时,触发器会自动调用,而存储过程必须显式调用。
一般来说, 根据 SQL 标准,触发器有两种类型:行级触发器和语句级触发器。
行级触发器: 这是一种触发器,它通过触发语句(如插入、更新或删除)为每一行激活。例如,如果表中插入、更新或删除多行数据,行触发器会自动为受影响的每一行触发。
语句级触发器: 这是一种触发器,它在发生在表上的每个事件中触发,无论插入、更新或删除多少行数据。
注意:我们应该知道MySQL不支持语句级触发器。它只提供对行级触发器的支持。
为什么我们在MySQL中需要/使用触发器?
我们在MySQL中需要/使用触发器是因为以下特点:
- 触发器帮助我们强制执行业务规则。
- 触发器帮助我们在插入或更新数据之前验证数据。
- 触发器帮助我们在表中保持记录日志,如维护审计跟踪。
- SQL触发器提供了一种检查数据完整性的替代方法。
- 触发器提供了一种运行定时任务的替代方法。
- 触发器提高了SQL查询的性能,因为它不需要每次执行查询时编译。
- 触发器减少了保存时间和精力的客户端代码。
- 触发器帮助我们在不同平台上扩展应用程序。
- 触发器易于维护。
在MySQL中使用触发器的限制
- MySQL触发器不允许使用所有验证,它们只提供了扩展验证。 例如 ,我们可以使用NOT NULL、UNIQUE、CHECK和FOREIGN KEY约束进行简单验证。
- 触发器在客户端应用程序中被调用和执行,因此很难调试数据库层中发生的情况。
- 触发器可能增加数据库服务器的开销。
MySQL中的触发器类型?
我们可以定义最多六种类型的操作或事件,以触发器形式:
- **在插入之前 : ** 它在将数据插入表之前激活。
- 在插入之后 : 它在将数据插入表后激活。
- 在更新之前 : 它在更新表中的数据之前激活。
- 在更新之后 : 它在更新表中的数据后激活。
- 在删除之前 : 它在数据从表中移除之前激活。
- 在删除之后 : 它在从表中删除数据后激活。
当我们使用不使用INSERT、UPDATE或DELETE查询来更改表中的数据时,与触发器相关联的触发器将不会被调用。
命名约定
命名约定是我们遵循的一套规则,用于给出合适的唯一名称。它可以节省我们的时间,使工作组织和可理解。因此, 我们必须为与表相关联的每个触发器使用唯一的名称 。但是,为不同表定义相同的触发器名称是一个很好的做法。
在 MySQL 中,应使用以下命名约定来命名触发器:
(BEFOR | AFTER) table_name (INSERT | UPDATE | DELETE)
因此,
触发器激活时间: BEFORE | AFTER
触发器事件: INSERT | UPDATE | DELETE
如何在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;