欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL之触发器

程序员文章站 2022-05-09 08:55:36
...

版权声明:本文为 小异常 原创文章,非商用*转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/102659479







由于工作需要,不得不研究一下 MySQL中的触发器,不过我先声明一下,触发器这种东西只有在并发不高的项目或管理系统中使用,如果是面向用户的高并发应用,都不要使用。

本篇博客主要讲解触发器的基本使用,会以几个简单的小案例讲解,可以暂时应付工作的需要。而我们一般开发尽量不要去使用这个东西,因为它本身没有提升多少性能,只是从代码上来说,可能很容易实现业务,所以我的观点是 尽可以的不要去使用触发器!


一、MySQL触发器概述

触发器 就是用来监视某种情况的,并且触发某种操作。它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会**它执行。

注意:mysql 5.7.2+ 版本之前,我们只能为表中的事件创建一个触发器。

1、触发器创建语法四要素:

1)监视地点【表(table)】

2)监视事件【insert/update/delete】

3)触发时间【After/Before】

4)触发事件【sql语句(insert/update/delete)】

2、触发器的基本语法:

CREATE TRIGGER 【触发器名字】  
【触发时间(After/Before)】 【监视事件(insert/update/delete)】 ON 【表名】  
FOR EACH ROW   #这句话在mysql是固定的,一定要写成这样 
BEGIN  
    【sql语句(只能写insert/update/delete语句,不要出现select from形式的语句,
    	如果只是单纯的给某个变量赋值是可以的(select '123' into @abc;))】;  
END; 

3、Navicat创建触发器的方法:

首先在 Navicat 中找到需要建立触发器对应的表,右键 “设计表”,然后创建触发器。
MySQL之触发器



二、一个简单的触发器

有一张学生表(student)和一张成绩表(score),表结构如下:

  • 学生表(student)
    MySQL之触发器

  • 成绩表(score)
    MySQL之触发器

这两张表暂时先不录入数据。我们先来设计一个触发器。需求是这样的:当在学生表中添加新的学生记录时,需要自动在成绩表中插入对应的学生信息,至于具体 math、chinese、english 字段不进行填写,由最后老师打分更新即可。

那么我们考虑一下如何设计触发器呢?

1)首先它是一个插入Insert触发器,是用来监视学生表(student)的 监视地点: student表,监视事件: insert】

2)它监视的事件是在插入前,所以是 Before触发时间: Before】

3)触发的事件是插入成绩表对应的学生记录,主要插入学生的学号(id)和姓名(name) 触发事件: insert into score (student_id, student_name) values (new.id, new.name);】

注意: new 表示 student 中新插入的值。

我们确定好触发器的四要素后就可以创建触发器了(可以使用 SQL语句 创建,也可以使用 Navicat 创建):

  • SQL语句创建:

    CREATE TRIGGER insert_student  
    Before insert ON student
    FOR EACH ROW   #这句话在mysql是固定的,一定要写成这样 
    begin
    	insert into score (student_id, student_name)
    	values (new.id, new.name);
    end
    
  • Navicat创建:
    MySQL之触发器

然后插入数据进行测试:

insert into student
values (1, '张三', '男');

你会发现在成绩表(score)中会多出来一条记录。

注意: 创建触发器和表一样,建议增加判断:DROP TRIGGER IF EXISTS insert_student;



三、判断值后调用触发器

在这里给大家讲个故事, “赵六” 这个学生是学校领导的关系户,那么这个学生就不需要进行录入成绩,三门科目的考试成绩全是100分。

那么我们的触发器应该这样设计了:监视地点、监视事件和触发时间不变,只是触发事件稍有改变。

CREATE TRIGGER insert_student2  
Before insert ON student
FOR EACH ROW   #这句话在mysql是固定的,一定要写成这样 
begin
	if new.name = '赵六' then
        insert into score (student_id, student_name, math, chinese, english)
        values (new.id, new.name, 100, 100, 100);
	end if;
end

有些小伙伴会在创建此触发器中,报 This version of MySQL doesn't yet support 'multiple triggers... 错误,详情请看:MySQL触发器问题之This version of MySQL doesn’t yet support 'multiple triggers…

然后插入数据进行测试:

insert into student
values (2, '赵六', '男');

你会发现在 “赵六” 这个学生在考试的时候走了后门,在成绩表(score)中 “赵六” 同学的成绩全是100分。

在这里补充一个知识点(if语句基本语法:

if 判断条件 then
	SQL语句;
end if;


四、Update触发器(实时更新)

再给大家讲个故事,有一天,“周七” 这个学生也入学了,“周七” 这个学生是省纪委派来暗中调查 “赵六” 同学是否有 “走后门” 的嫌疑,“赵六” 同学为了避免露馅,当 “周七” 同学入学时,就自动将自己的三门成绩全部改为 “60分”。

那么我们的触发器应该这样设计了:监视地点、监视事件和触发时间不变,也还是触发事件稍有改变。

CREATE TRIGGER insert_student3  
Before insert ON student
FOR EACH ROW   #这句话在mysql是固定的,一定要写成这样 
begin
	if new.name = '周七' then
		update score 
		set math = 60, chinese = 60, english = 60
		where student_name = '赵六';
	end if;
end

然后插入数据进行测试:

insert into student
values (3, '周七', '男');

你会发现在 “赵六” 这个学生成功躲过了 “周七” 同学的 “调查”。


博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



相关标签: MySQL 触发器