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


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

查看所有标签

猜你喜欢:

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

Python Algorithms

Python Algorithms

Magnus Lie Hetland / Apress / 2010-11-24 / USD 49.99

Python Algorithms explains the Python approach to algorithm analysis and design. Written by Magnus Lie Hetland, author of Beginning Python, this book is sharply focused on classical algorithms, but it......一起来看看 《Python Algorithms》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码