含义:
指定一个触发的条件,Mysql 在执行一个insert、update或者 delete sql 时满足了触发器的条件,将按照触发器指定的条件自动执行指定好的某个sql;
创建一个触发器:
1. 唯一的触发器名;
2. 触发器关联的表;
3. 触发器应该响应的活动(DELETE、INSERT或UPDATE);
4. 触发器何时执行(处理之前或之后)。
举例:
假如我有一个产品表 products, 一个日志记录表 sys_logs,创建一个触发器,使得每插入一个products数据都记录下这个数据的信息:
create TRIGGER after_inserts_add_log AFTER INSERT ON products
FOR EACH ROW insert INTO sys_logs(sys_logs.table_name, sys_logs.action, sys_logs.record_id) VALUES (NEW.name, 'insert test', NEW.id);
上面触发器的结构为:
create trigger 触发器名 AFTER INSERT/BEFORE INSERT/AFTER DELETE/BEFORE DELETE/BEFORE UPDATE/AFTER UPDATE on 表名 for each row 你想让触发器执行的sql (在触发器执行的sql中 ,可以引用mysql 内部的 NEW和OLD虚拟表来获取触发前后被更新的数据的字段)
-
其他
-
使用触发器记录数据库数据的变动非常容易,是创建数据库审计跟踪的方案。
- 删除一个触发器:
DROP TRIGGER 触发器名;
-
可以在一个触发器中指定一系列动作,一系列sql,使用 BEGIN 和 END关键字:也可以解决存储引擎不支持同一个表有多个类型的触发器的问题
This version of MariaDB doesn't yet support 'multiple triggers with the same action time and event for one table' 同一个表不支持多个相同触发类型的触发器
create TRIGGER after_inserts_1 AFTER INSERT ON products FOR EACH ROW BEGIN insert INTO sys_logs(sys_logs.table_name, sys_logs.action, sys_logs.record_id) VALUES (NEW.name, 'insert test_ACTION1', NEW.id); insert INTO sys_logs(sys_logs.table_name, sys_logs.action, sys_logs.record_id) VALUES (NEW.name, 'insert test_ACTION2', NEW.id); END;
修改后的引擎,每插入一个products数据,都记录两条sys_logs数据,action分别是 insert test_ACTION1和insert test_ACTION2;
- 查看触发器
SHOW TRIGGERS;