MySQL之触发器

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址: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 中找到需要建立触发器对应的表,右键 “设计表”,然后创建触发器。
Navicat创建触发器



二、一个简单的触发器

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

  • 学生表(student)
    student表

  • 成绩表(score)
    score表

这两张表暂时先不录入数据。我们先来设计一个触发器。需求是这样的:当在学生表中添加新的学生记录时,需要自动在成绩表中插入对应的学生信息,至于具体 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创建:
    Navicat创建触发器

然后插入数据进行测试:

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, '周七', '男');

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


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小异常

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值