详解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 触发器的资料请关注我们其它相关文章!

(0)

相关推荐

  • MySQL触发器概念、原理与用法详解

    本文实例讲述了MySQL触发器概念.原理与用法.分享给大家供大家参考,具体如下: 1.触发器的概念 触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行.--百度百科 上面是百度给的触发器的概念,我理解的触发器的概念,就是你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的s

  • mysql日志触发器实现代码

    sql语句 DROP TRIGGER IF EXISTS sys_menu_edit; CREATE TRIGGER sys_menu_edit BEFORE UPDATE ON sys_menu FOR EACH ROW BEGIN INSERT INTO `g4m`.`sys_log` ( `table_name`, `val_id`, `data_json` ) VALUES ( 'sys_menu', old.id, CONCAT( "{", CONCAT_WS( ',', C

  • MySQL 触发器定义与用法简单实例

    本文实例讲述了MySQL 触发器定义与用法.分享给大家供大家参考,具体如下: 语法 CREATE TRIGGER 触发器名称  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象. { BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后. { INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert.update或delete的过程中触发. ON 表名称

  • MySql视图触发器存储过程详解

    视图: 一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称.视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图. 创建: create view v1 as SQL 例如:create view v1 as select * from student where sid<10 创建后如果使用mysql终端可以看到一个叫v1的表,如果用navicate可以在视图中看到生成了一个v1的视图 再次使用时,可以直接

  • mysql触发器原理与用法实例分析

    本文实例讲述了mysql触发器原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是触发器 创建触发器 单条触发器语句 多条触发器语句 查看触发器 删除触发器 触发器的新旧记录引用 首发日期:2018-04-14 什么是触发器: 触发器用来在某些操作之后,"自动"执行一些操作.(比如插入了新的学生信息,那么在班级表中应该修改学生数). 当insert delete update设置触发器之后,执行insert delete update操作就会自动触发设置的内容. 一张表最大

  • mysql触发器之触发器的增删改查操作示例

    本文实例讲述了mysql触发器之触发器的增删改查操作.分享给大家供大家参考,具体如下: 我们在创建触发器后,可以在包含触发器定义文件的数据文件夹中显示其定义.触发器作为纯文本文件存储在以下数据库文件夹中: /data_folder/database_name/table_name.trg 我们还可通过查询information_schema数据库中的triggers表来显示触发器,如下所示: SELECT * FROM information_schema.triggers WHERE trig

  • mysql触发器之创建使用触发器简单示例

    本文实例讲述了mysql触发器之创建使用触发器.分享给大家供大家参考,具体如下: 我们可以可以使用CREATE TRIGGER语句创建一个新的触发器,来看下具体的语法: CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN ... END; 然后我们来详细看下上述sql的具体含义: 将触发器名称放在CREATE TRIGGER语句之后.触发器名称应遵循命名约定[trigger

  • mysql 触发器语法与应用示例

    本文实例讲述了mysql 触发器语法与应用.分享给大家供大家参考,具体如下: 例子:创建触发器,记录表的增.删.改操作记录 //创建user表: DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `account` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `address` varc

  • mysql触发器简介、创建触发器及使用限制分析

    本文实例讲述了mysql触发器简介.创建触发器及使用限制.分享给大家供大家参考,具体如下: 简介 SQL触发器是存储在数据库目录中的一组SQL语句.每当与表相关联的事件发生时,即会执行或触发SQL触发器,例如插入,更新或删除.SQL触发器也可以当做是一种特殊类型的存储过程. 它是特别的,因为它不像直接像存储过程那样调用. 触发器和存储过程之间的主要区别在于,当对表执行数据修改事件时,会自动调用触发器,而存储过程必须要明确地调用. 完事我们来看下SQL触发器的优点: SQL触发器提供了检查数据完整

  • mysql触发器之创建多个触发器操作实例分析

    本文实例讲述了mysql触发器之创建多个触发器操作.分享给大家供大家参考,具体如下: 这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的.废话不多说,咱们开始正文哈. 在mysql 5.7.2+版本之前,我们只能为表中的事件创建一个触发器,例如,只能为BEFORE UPDATE或AFTER UPDATE事件创建一个触发器. mysql 5.7.2+版本解决了这样限制,并允许我们为表中的相同事件和动作时间创建多个触发器.当事件发生时,触发器将依次激活.我们来参考创建第一个触发

  • Mysql中禁用与启动触发器教程【推荐】

    在使用MYSQL过程中,经常会使用到触发器,但是有时使用不当会造成一些麻烦.有没有一种办法可以控制触发器的调用呢? 触发器顾名思义就是数据库在一定的调条件自动调用的SQL语句,触发器拒绝了人工调用的过程,由数据库MYSQL数据库自动的调用,执行更加高效. 如何禁用触发器呢? 1.新建两张表: 表demo_1: CREATE TABLE `demo_1` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `STUNAME` varchar(3

随机推荐