详解MySQL数据库之触发器

 更新时间:2020年09月30日 08:43:14   作者:奥辰  
这篇文章主要介绍了MySQL数据库之触发器的相关资料,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下

1 引言

本文是对MySQL中触发器的总结,从触发器概念出发,结合实例对创建触发器、使用触发器、删除触发器进行介绍。

2 触发器简介

MySQL触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE、DELETE。如果定义了触发器,当数据库执行这些语句的时候就会激活触发器执行相应的操作,触发程序是与表有关的命令数据库对象,当表上出现特定事件,将激活该对象。

  触发器是一个特殊的存储过程,不同的是,执行存储过程要使用call语句来调用,而触发器的执行不需要用call来调用,也不需要手工启动,只要当一个预定义的事件发生,触发器就会被MySQL自动调用。触发器可以查询其他表,而且可以包含复杂的SQL语句。

3创建触发器

  (1)创建只有一条执行语句的触发器

  语法结构如下:

CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_stmt

  trigger_name:用户自定义的触发器名称;

  trigger_time:标识触发事件,可以指定为before(时间发生前执行)或after(事件发生后执行);

  trigger_event:标识触发事件,包括INSERT、UPDATE、DELETE;

  table_name:触发器建立在哪个表上;

  trigger_stmt:触发器执行语句。

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

语法结构如下:

CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW

 BEGIN

  语句执行列表

 END

当触发器有至少一条的执行语句时,多条执行语句需要用BEGIN和END包裹,分别表示整个代码块的开始和结束。

  为演示触发器操作,我们先创建一下三个数据表:

create table tb_student(

   id int PRIMARY key auto_increment,

   name varchar(10)

);

create table tb_before_trigger(

   id int PRIMARY key auto_increment,

   num int ,

   time_now datetime NULL DEFAULT CURRENT_TIMESTAMP

);

create table tb_after_trigger(

   id int PRIMARY key auto_increment,

   num int ,

   time_now datetime NULL DEFAULT CURRENT_TIMESTAMP

);

  示例1:创建一个名为before_trigger的触发器,该触发器会在每次对表tb_student执行insert操作前触发,触发时会往before_trigger表插入一条包含tb_student表总记录数的记录。

delimiter //

create trigger before_trigger before insert

   on tb_student for each row

   begin

     insert into tb_before_trigger (num) select count(*) from tb_student;

   end

   //

delimiter ;

  示例2:创建一个名为after_trigger的触发器,该触发器会在每次对表tb_student执行insert操作前触发,触发时会向before_trigger表插入一条包含tb_student表总记录数的记录。

delimiter //

create trigger after_trigger after insert

   on tb_student for each row

   begin

     insert into tb_after_trigger (num) select count(*) from tb_student;

   end

   //

delimiter ;

  来测试一下示例1和示例2中创建的触发器,往tb_student表中插入一条数据(插入前3个表没有任何记录):

insert into tb_student (name) values('zhangsan');

  插入后,查看三个表中数据:

  tb_student表:

  tb_before_trigger表:

  tb_after_trigger表:

  可以看到,在tb_student表执行insert操作后,另外两个表也分别更新了记录,tb_before_trigger表num值为0,证明在tb_student执行insert操作前插入的;tb_after_trigger表num值为1,证明在tb_student执行insert操作后插入的——这就是before与after的区别。

  对于其他条件触发器,使用方法与示例1和示例2类似,本文不在演示。

4 查看触发器

  (1)show triggers语句

  通过show triggers语句可以查看示例1和示例2中创建的触发器:

show triggers;

  输出结果:

  (2)在triggers表中查看触发器

  在information_schema数据库的triggers表中存放在MySQL数据库中的所有触发器,可以通过查询语句进行查看:

select * from information_schema.triggers where trigger_name = 'before_trigger' ;

  输出结果:

  当不指定查询条件时,即是指查看所有触发器信息。

5 删除触发器

  使用DROP TRIGGER语句可以删除触发器,基本语法结构如下:

DROP TRIGGER [schema_name] trigger_name

  其中,schema_name表示数据库名称,是可选参数,如果省略则表示从当前数据库中删除触发器。

  示例3:删除示例1中创建的触发器before_trigger

drop trigger before_trigger;

6 总结

在某些时候,触发器可以起到锦上添花的作用,但是,触发器的效率并不高,所以还是尽量少用。

作者:奥辰

Github:https://github.com/ChenHuabin321

以上就是详解MySQL数据库之触发器的详细内容,更多关于MySQL 触发器的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL高可用解决方案MMM(mysql多主复制管理器)

    MySQL高可用解决方案MMM(mysql多主复制管理器)

    MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。MMM不仅能提供浮动IP的功能,如果当前的主服务器挂掉后,会将你后端的从服务器自动转向新的主服务器进行同步复制,不用手工更改同步配置
    2017-09-09
  • MySQL表的增删改查基础教程

    MySQL表的增删改查基础教程

    这篇文章主要给大家介绍了关于MySQL表的增删改查的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 关于SqlServer中datediff用法

    关于SqlServer中datediff用法

    datediff是SQL SERVER里面的用法,ORACLE没有,主要作用是返回两个日期之间的时间间隔,本文通过实例代码给大家详细讲解,对datediff用法感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • mysql 查看当前使用的配置文件my.cnf的方法(推荐)

    mysql 查看当前使用的配置文件my.cnf的方法(推荐)

    下面小编就为大家带来一篇mysql 查看当前使用的配置文件my.cnf的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • MySQL过滤重复数据的两种方法示例

    MySQL过滤重复数据的两种方法示例

    数据库生成环境中经常会遇到表中有重复的数据,或者进行关联过程中产生重复数据,下面这篇文章主要给大家介绍了关于MySQL过滤重复数据的两种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 通过存储过程动态创建MySQL对象的流程步骤

    通过存储过程动态创建MySQL对象的流程步骤

    在当今数据驱动的世界中,高效的数据库管理至关重要,本文将展示如何通过存储过程自动化地创建各种 MySQL 数据库对象,通过这些方法,我们可以快速响应业务需求,提高数据库管理的灵活性和效率,需要的朋友可以参考下
    2024-10-10
  • MySQL聚簇索引、非聚簇索引、覆盖索引详解

    MySQL聚簇索引、非聚簇索引、覆盖索引详解

    这篇文章详细介绍了聚簇索引、非聚簇索引和覆盖索引的概念,并通过图示和实例说明了索引查找的过程和回表查询的概念,同时,文章也提到了覆盖索引的优点和弊端,并给出了适用场景
    2024-12-12
  • MySQL修改数据表存储引擎的3种方法介绍

    MySQL修改数据表存储引擎的3种方法介绍

    这篇文章主要介绍了MySQL修改数据表存储引擎的3种方法介绍,分别是直接修改、导出导入、创建插入3种方法,需要的朋友可以参考下
    2014-07-07
  • DQL命令查询数据实现方法详解

    DQL命令查询数据实现方法详解

    DQL(Data Query Language,数据查询语言),查询数据库数据,如SELECT语句,简单的单表查询或多表的复杂查询和嵌套查询,数据库语言中最核心、最重要的语句,使用频率最高的语句
    2022-09-09
  • Mysql Workbench查询mysql数据库方法

    Mysql Workbench查询mysql数据库方法

    在本篇文章里小编给大家分享了个关于Mysql Workbench查询mysql数据库方法和步骤,有需要的朋友们学习下。
    2019-03-03

最新评论