1、触发器概念
- MySQL 从 5.0.2版本开始支持触发器的功能。
- 通俗的理解触发器就是,操作人员对数据库表进行操作时,满足了触发的条件,就会执行触发器里面特定的语句。
- 等式理解:触发器 = sql + 控制结构
比如学生表(stu)进行操作新增的时后,日志表(logs)需要记录。不用触发器就是我们在后台持久层中新增记录日志;使用触发器后,当学生表新增时,就可以自动执行里面的语句,记录日志。
2、创建触发器
基本语法
CREATE TRIGGER 触发器名称 trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
-- trigger_time 触发器时间
-- trigger_event 触发事件
-- tbl_name 触发表名称
-- trigger_stmt 触发后执行的语句
trigger_event 触发事件
触发事件取值为 INSERT,UPDATE,DELETE
- INSERT:插入触发事件,能通过 INSERT、LOAD DATA、REPLACE 语句触发;
- UPDATE:更新触发事件,能通过 UPDATE 语句触发;
- DELETE:删除触发事件,能通过 DELETE、REPLACE 语句触发。
应为Mysql因为还定义了LOAD DATA 和 REPLACE 语句,INSERT触发事件也支持这两种语句。若不明白这两种语句,自行百度。
trigger_stmt 触发执行语句
trigger_stmt 使用BEGIN END语句块
-- demo 当触发器执行语句块,就会向日志表插入一条自定义数据
BEGIN
DECLARE rs; -- 定义数据
set re = "记录日志信息" -- 设置数据
insert into logs(log_info) value(re);
END
NEW、OLD关键字
这里只给了含义,详细看后面的举例,一目了然
- NEW.columnName (获取INSERT触发事件中新插入的数据)
- OLD.columnName (获取UPDATE和DELETE 触发事件中更新、删除的数据)
trigger_event 触发器时间
trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。触发事件可选项为before,after。
- after:就是增删改完成之后,执行触发器
- before:就是增删改完成之前,执行触发器
具体有什么区别呢
触发器功能举例:比如加班表,超过8小时全部按照8小时。
-- 创建触发器 触发事件选择before
-- DELIMITER是分隔符,因为 Mysql里面是用‘;’结束的,触发器的分行是‘;’,冲突了,所以分隔符
DELIMITER $
CREATE TRIGGER insert_ot_tig before INSERT on overtime for each row
BEGIN
-- new.time就获取了time的这个数据
if new.time>8 THEN
set new.time=8;
end if;
END $
DELIMITER;
-- 插入数据
insert into overtime(name,time) values('james',19);
结果如图
如果before是在触发器时间选择after,创建触发器就会报错,翻译过来就是触发器不允许NEW更新,其实就是如果是after,就是insert已经结束才运行触发器,理解为你数据都插入了,还要我做什么。
小结
-- 创建触发器
CREATE TRIGGER 触发器名 BEFORE|AFTER
insert|update|delete ON 触发表名
FOR EACH ROW
BEGIN
执行语句列表
END
Demo
就日志表和学生表,学生表插入的时候自动记录日志
-- 创建触发器
DELIMITER $
CREATE TRIGGER stu_logs after INSERT on stu for each row
BEGIN
DECLARE logInfo VARCHAR(100);
set logInfo = CONCAT(new.name,'创建成功,所属班级为',new.class); -- CONCAT拼接函数
insert into logs(log_info,log_time) VALUES(logInfo,CURRENT_TIMESTAMP);-- CURRENT_TIMESTAMP 获取时间
END $
DELIMITER;
-- 执行插入学生 sql
insert into stu(name,age,class) VALUES('张三',14,'2018级6班')
结果如下:
插入学生张三的时候,触发器执行,向日志表自动添加日志
3、查看触发器
- sql语句
show triggers
- 触发器存放位置
安装Mysql后,在information_schema数据库中有个表叫TRIGGERS,存放Mysql的触发器
4.删除触发器
与删除表的语法一样
drop trigger 触发器名
5、触发器错误与sql回滚
不论触发器是before类型还是after类型,如果触发器执行执行失败,那么sql语句是否会正常执行,如何sql执行失败,触发器又如何执行呢?
- before 类型,在sql语句执行之前,如果触发器错误,sql直接不执行
- after 类型,在sql语句之后,如何sql执行成功,触发器失败,sql回滚;如何sql失败,触发器直接不执行。
小结
sql与触发器一方存在问题,整个流程全部失败,数据与执行一样,保证事务的原子性。
6、结束语
莫失精诚赤子心