Mysql 触发器

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小时。

image

-- 创建触发器 触发事件选择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);

结果如图

image

如果before是在触发器时间选择after,创建触发器就会报错,翻译过来就是触发器不允许NEW更新,其实就是如果是after,就是insert已经结束才运行触发器,理解为你数据都插入了,还要我做什么。

image

小结
-- 创建触发器
CREATE TRIGGER 触发器名 BEFORE|AFTER  
insert|update|delete ON 触发表名 
FOR EACH ROW 
BEGIN
    执行语句列表
END

Demo

就日志表和学生表,学生表插入的时候自动记录日志

image

-- 创建触发器
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班')

结果如下:
插入学生张三的时候,触发器执行,向日志表自动添加日志

image

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、结束语

莫失精诚赤子心

博客出处 : https://www.cnblogs.com/augusduan/p/9187890.html

posted @ 2018-06-15 16:24  莫失精诚赤子心  阅读(1579)  评论(0编辑  收藏  举报