MySQL数据库之触发器

栏目: 数据库 · 发布时间: 6年前

内容简介:本文是对MySQL中触发器的总结,从触发器概念出发,结合实例对创建触发器、使用触发器、删除触发器进行介绍。MySQL触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE、DELETE。如果定义了触发器,当数据库执行这些语句的时候就会激活触发器执行相应的操作,触发程序是与表有关的命令数据库对象,当表上出现特定事件,将激活该对象。触发器是一个特殊的存储过程,不同的是,执行存储过程要使用call语句来调用,而触发器的执行不需要用call来调用

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表:

MySQL数据库之触发器

tb_before_trigger表:

MySQL数据库之触发器

tb_after_trigger表:

MySQL数据库之触发器

可以看到,在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;

输出结果:

MySQL数据库之触发器

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

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

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

输出结果:

MySQL数据库之触发器

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

5 删除触发器

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

DROP TRIGGER [schema_name] trigger_name

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

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

drop trigger before_trigger;

6 总结

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

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-12/155915.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

走出软件作坊

走出软件作坊

阿朱 / 电子工业出版社 / 2009-1 / 39.80

《走出软件作坊》这本书提供了解决国内小型IT企业发展的过程中会遇到的项目管理问题的若干方法。主要以作者自身多年工作的宝贵经验,来谈软件公司的项目管理和团队建设,包括对中小软件公司软件开发组织结构、团队文化、软件过程管理、团队激励、绩效考核、职业发展规划、未来业界发展趋势、个人素质提升等,具有实际指导意义。主要读者对象是IT企业的研发主管、项目经理和软件开人中同,以及即将到IT企业工作的高校毕业生。一起来看看 《走出软件作坊》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具