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 总结

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

MySQL数据库之触发器的更多相关文章

  1. Mysql数据库的触发器、存储引擎和存储过程

    数据库的触发器 1.触发器 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句): DELETE,INSERT,UPDATE 我们可以监视某表 ...

  2. 40、mysql数据库(触发器)

    1.触发器说明: 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询. 2.创建触发器语法: (1)插入前: CREATE TRIGGER tri_before_insert ...

  3. 第二百八十四节,MySQL数据库-MySQL触发器

    MySQL数据库-MySQL触发器 对某个表进行[增/删/改]操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行[增/删/改]前后的行为. 1.创建触发器基本语法 ...

  4. mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

    mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...

  5. MySQL数据库(6)_用户操作与权限管理、视图、存储过程、触发器、基本函数

    用户操作与权限管理 MySQL用户操作 创建用户 方法一: CREATE USER语句创建 CREATE USER "用户名"@"IP地址" IDENTIFIE ...

  6. MySQL数据库(5)_MySQL数据库视图、触发器

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( S ...

  7. MySQL/MariaDB数据库的触发器

    MySQL/MariaDB数据库的触发器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.触发器概述 1>.什么是触发器 触发器的执行不是由程序调用,也不是由手工启动,而是 ...

  8. mysql数据库之 存储引擎、事务、视图、触发器、存储过程、函数、流程控制、数据库备份

    目录 一.存储引擎 1.什么是存储引擎? 2.mysql支持的存储引擎 3. 使用存储引擎 二.事务 三.视图 1.什么是视图 2.为什么要用视图 3.如何用视图 四.触发器 为何要用触发器 创建触发 ...

  9. PostgreSQL 优势,MySQL 数据库自身的特性并不十分丰富,触发器和存储过程的支持较弱,Greenplum、AWS 的 Redshift 等都是基于 PostgreSQL 开发的

    PostgreSQL 优势 2016-10-20 21:36 686人阅读 评论(0) 收藏 举报  分类: MYSQL数据库(5)  PostgreSQL 是一个自由的对象-关系数据库服务器(数据库 ...

随机推荐

  1. 引用EChart和Bootstrap

    1.怎么引用Echart 下载之后,写一个html,里面这样写 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  2. hdu 6166 Senior Pan

    http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意: 给出一张无向图,给定k个特殊点 求这k个特殊点两两之间的最短路 二进制分组 枚举一位二进制位 这一 ...

  3. zsh与oh-my-zsh是什么

    zsh是bash的增强版,其实zsh和bash是两个不同的概念.zsh更加强大. 通常zsh配置起来非常麻烦,且相当的复杂,所以oh-my-zsh是为了简化zsh的配置而开发的,因此oh-my-zsh ...

  4. spring框架学习(一)入门

    spring 入门--IOC  1.导入jar包 4 + 1  : 4个核心(beans.core.context.expression) + 1个依赖(commons-loggins...jar) ...

  5. [转载]AngularJS之Factory vs Service vs Provider

    http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider http://tylermcginnis.com/a ...

  6. iOS 中nil,Nil,NULL,NSNull的区别

    类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法). 对象是类的一个实例,是一个具体的事物. 类与对象是抽象与具体的关系. 类其实就是一种数据 ...

  7. Mahalanobis距离(马氏距离)的“哲学”解释

    讲解教授:赵辉 (FROM : UESTC) 课程:<模式识别> 整理:PO主 基础知识: 假设空间中两点x,y,定义: 欧几里得距离, Mahalanobis距离, 不难发现,如果去掉马 ...

  8. ruby http爬虫中的 :body 用法问题

    require 'http' url = 'http://localhost/b.php' data = 'whoami=whoami' html = HTTP.via('127.0.0.1',808 ...

  9. pandas删除dataframe列

    data2 = data.drop(data.columns[0,1,3,4,6,8,10], 1)

  10. Vue项目中如何引用外部js

    第一种方法:(感觉这个有问题) 1.把需要的js放到static文件夹下 2.在Index.html页面引入 3.在webpack.base.conf.js添加下面代码 externals: { 'W ...