MySQL 触发器
MySQL 触发器(Trigger)是一种在数据库中定义的特殊类型的存储过程,它在指定的数据库表上自动执行,当满足特定的触发条件时,触发器会被激活并执行相应的操作。触发器通常用于在数据库表发生特定事件时,自动执行一些操作,如更新其他表的数据、记录日志等。
语法规则
创建触发器
在 MySQL 中,定义触发器遵循以下规则:
-
触发器类型: MySQL 支持
BEFORE
和AFTER
两种触发器类型。BEFORE
触发器在触发事件之前执行,而AFTER
触发器在触发事件之后执行。 -
触发事件: 触发器可以在指定的数据库表上监听多种触发事件,包括
INSERT
(插入)、UPDATE
(更新)和DELETE
(删除)。每个触发器只能针对一种事件。 -
触发时机: 在触发器类型为
BEFORE
的情况下,触发器在执行前被激活;而在触发器类型为AFTER
的情况下,触发器在执行后被激活。 -
触发条件: 触发器可以定义触发的条件,即触发器执行的条件。例如,在
BEFORE INSERT
触发器中,可以定义在插入数据之前验证数据的条件。 -
触发操作: 触发器可以执行一系列 SQL 语句,包括数据的增删改操作、查询、记录日志等。在
BEFORE
触发器中,可以修改 NEW 对象的值(NEW 表示要插入或更新的新行)。在AFTER
触发器中,可以使用 OLD 和 NEW 对象(OLD 表示要删除或更新的旧行,NEW 表示要插入或更新的新行)。 -
创建触发器: 使用
CREATE TRIGGER
语句来创建触发器。语法如下:CREATE TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW BEGIN -- 触发器执行的操作 END;
以上是 MySQL 中定义触发器的基本规则。需要注意的是,触发器的创建和使用涉及到数据库的操作,需要具备相应的数据库权限。在使用触发器之前,应该慎重考虑触发器的设计和实现,确保其满足业务需求,并不会对数据库性能和数据完整性产生负面影响。
案例:
CREATE TABLE test_trigger
(
id INT PRIMARY KEY AUTO_INCREMENT,
t_note VARCHAR(30)
);
CREATE TABLE test_trigger_log
(
id INT PRIMARY KEY AUTO_INCREMENT,
t_log VARCHAR(30)
);
# 创建触发器
DELIMITER $
CREATE TRIGGER before_test_trigger_insert_tri
BEFORE INSERT
ON test_trigger
FOR EACH ROW
BEGIN
INSERT INTO test_trigger_log(t_log) VALUES ('before insert...');
END $
DELIMITER
# 测试
INSERT INTO test_trigger(t_note)
VALUES ('Tom...')
查看触发器
可以使用以下两种方法来查看数据库中已经定义的触发器:
-
使用 SHOW TRIGGERS 命令:
使用
SHOW TRIGGERS
命令可以查看当前数据库中已经定义的触发器列表。SHOW TRIGGERS; SHOW CREATE TRIGGER before_test_trigger_insert_tri;
这将返回一个结果集,其中包含数据库中所有触发器的信息,包括触发器名称、表名、事件类型、触发时间、触发语句等。
-
使用 INFORMATION_SCHEMA 视图:
MySQL 中的 INFORMATION_SCHEMA 是一个数据库信息查询的元数据视图。你可以使用 INFORMATION_SCHEMA 视图来查看触发器的详细信息。
# 从系统库的TRIGGERS表中查询触发器 SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE, ACTION_TIMING, EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS # WHERE TRIGGER_SCHEMA = 'your_database_name';
将
your_database_name
替换为你实际的数据库名称。这将返回与数据库中定义的所有触发器相关的信息,包括触发器名称、所在表、事件类型、触发时间、触发语句等。
删除触发器
DROP TRIGGER IF EXISTS before_test_trigger_insert_tri;