有志者,事竟成
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

在这里插入图片描述


前言

触发器(TRIGGER)是由事件来触发某个操作。这些事件包括insert语句、update语句和delete语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。

一、创建触发器

触发器是由insert、update和delete等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生信息时,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数一致的。触发器触发的执行语句可能只有一个,也可能有多个。

1、创建只有一个执行语句的触发器

在MySQL中,创建只有一个执行语句的触发器的基本形式如下:

create trigger 触发器名 before | after 触发事件
on 表名 for each row 执行语句

其中,触发器名参数指要创建的触发器的名字;before和after参数指定了触发器执行的时间,“before”指在触发事件之前执行触发语句,after表示在触发事件之后执行触发语句;“触发事件”参数指触发的条件,其中包括insert、update和delete;“表名”参数指触发事件操作的表的名称;for each row表示任何一条记录上的操作满足触发事件都会触发该触发器;“执行语句”参数指触发器被触发后执行的程序。

下面创建一个由insert触发的触发器dept_trig1。代码如下:

在这里插入图片描述

结果显示触发器dept_trig1已经创建成功。当向department表中执行insert操作时,数据库系统都会在insert语句执行之前向trigger_time表中插入当前时间。下面向department表中插入一条记录,然后查看trigger_time表中是否执行insert操作。代码执行如下:

在这里插入图片描述
在这里插入图片描述

执行结果显示,在向department表中执行insert操作时,trigger_time中插入了当前的系统时间。从这个例子可以看出,insert成功的触发了触发器。

2、创建有多个执行语句的触发器

MySQL中,触发器触发的执行语句可能有多个。创建有多个执行语句的触发器的基本形式如下:

create trigger 触发器名 before | after 触发事件
on 表名 for each row
begin
	执行语句列表
end

其中,begin与end直接的“执行语句列表”参数表示需要执行的多个执行语句的内容。不同的执行语句之间用分号隔开。

注意:一般情况下,MySQL默认是以“;”作为结束执行语句。在创建触发器过程中需要用到“;”。为了解决这个问题,可以用delimiter语句。如“delimiter&&”,可以将结束符号变成“&&”。当触发器创建完成后,可以用命令“delimiter;”来将结束符号变成“;”。

下面创建一个由delete触发多个执行语句的触发器dept_trig2。代码如下:

在这里插入图片描述

执行结果显示,触发器创建成功。当在department表中执行delete操作后,trigger_time表中将插入两条记录。代码执行如下:

在这里插入图片描述
执行结果显示,在向department表中执行delete操作时,trigger_time中插入了两条记录。从这个例子可以看出,触发器可以同时执行多条执行语句。

注意:MySQL中,一个表在相同触发时间的相同触发条件,只能创建一个触发器。例如,在department表中,触发事件insert,触发时间为after的触发器只能有一个。但是,可以定义触发事件为before的触发器。如果该表中执行insert语句,那么这个触发器就会自动执行。

二、查看触发器

查看触发器是指查看数据库中已存在的触发器的定义、状态和语法等信息。查看触发器的方法包括show triggers语句和查询information_schema数据库下的triggers表等。

1、show triggers语句查看触发器信息

MySQL中,可以执行show triggers语句来查看触发器的基本信息。其基本形式如下:

show triggers;

下面执行show triggers语句的结果如下:

在这里插入图片描述

结果显示了所有触发器的基本信息。因为数据库中暂时只有两个触发器,所以只显示了这两个触发器的基本信息。

技巧:show triggers语句无法查询指定的触发器,该语句只能查询所有触发器的信息。如果数据库系统中的触发器很多,将显示很多信息。这样不方便找到所需要的触发器的信息。因此,在触发器很少时,可以选择show triggers语句。

2、在triggers表中查看触发器信息

在MySQL中,所有触发器的定义都存在information_schema数据库下的triggers表中。查询triggers表,可以查看到数据库中所有触发器的详细信息。查询的语句如下:

select * from information_schema.triggers;

其中,“*”表示查询所有的列的信息;“information_schema.triggers”表示information_schema数据库下面的triggers表。

下面是用select语句查询triggers表中的信息。代码执行如下:

在这里插入图片描述
结果显示了所有触发器的详细信息。同时,该方法可以查询指定触发器的详细信息。其语句基本形式如下:

select * from information_schema.triggers where trigger_name='触发器名';

其中,“触发器名”参数指要查看的触发器的名称,需要用单引号引起来。

下面是用select语句查询触发器dept_trig1的信息。代码执行如下:

在这里插入图片描述
结果显示了触发器dept_trig1的详细信息。这种方式可以查询指定的触发器,使用起来更加方便、灵活。

技巧:所有触发器的信息都存储在information_schema数据库下的triggers表中,可以使用select语句从triggers表中查询触发器的信息。如果数据库中的触发器比较多时,那么triggers表中记录会比较多。使用select语句查询时,最好通过trigger_name字段进行查询。

三、触发器的使用

在MySQL中,触发器执行的顺序是before触发器、表操作(insert、update和delete)和after触发器。下面通过一个示例演示这三者的执行顺序。

下面在department表上创建before insert和after insert这两个触发器。在向department表中插入数据时,观察这两个触发器的触发顺序。创建触发器的代码如下:

//创建before insert触发器
create trigger before_insert before insert
	on department for each row
	insert into trigger_test values(null,"before_insert");
//创建after insert触发器
create trigger after_insert after insert
	on department for each row
	insert into trigger_test values(null,"after_insert");

触发器都创建好以后,向department表中插入一条记录。代码执行如下:

在这里插入图片描述
执行结果显示,记录插入成功。现在可以查看trigger_test表中的记录。代码执行如下:

在这里插入图片描述

四、删除触发器

删除触发器指删除数据库中已经存在的触发器。MySQL中使用drop trigger语句来删除触发器。其基本形式如下:

drop trigger 触发器名;

其中,“触发器名”参数指要删除的触发器的名称。如果只指定触发器名称,数据库系统会在当前数据库下查找该触发器。如果找到,就执行删除。如果指定数据库,数据库系统就会到指定的数据库下去查找触发器。例如,job.worker_trig表示job数据库下的触发器worker_trig。

注意:如果不再需要某个触发器时,一定要将这个触发器删除。如果没有将这个触发器删除,那么每次执行触发器事件时,都会执行触发器中的执行语句。执行语句会对数据库中的数据进行某些操作,这会造成数据的变化。因此,一定要删除不需要的触发器。

下面是执行drop trigger语句来删除触发器dept_trig1。代码执行如下:

在这里插入图片描述
结果显示删除成功。为确定触发器是否真的删除,可以用select语句来查询‘dept_trig1’的信息。select语句执行如下:

在这里插入图片描述

执行结果显示,不存在该记录。这说明触发器dept_trig1已经删除成功。

五、总结

这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐