目录

一、触发器的概念

二、创建触发器

三、查看触发器

四、删除触发器

总结


一、触发器的概念

在实际开发中往往会碰到这样的情况:

当我们对一个表进行数据操作时,需要同步对其它的表执行相应的操作,正常情况下,如果我们使用sql语句进行更新,将需要执行多条操作语句!

        比如,在某些棋牌游戏中,当玩家充值金币后,玩家表数据库中金币增加的同时,玩家所属的代理会得到相应的提成并计入代理的收益中,即代理数据库表提成记录字段也要同步更新。

而以上的场景,我们可以轻松使用触发器来实现!

触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。MySQL从5.0.2版本开始支持触发器。

通过本章的学习,我们将了解触发器的含义和作用、如何创建触发器、查看触发器和删除触发器的方法。同时,可以了解各种事件的触发器的执行情况。

二、创建触发器

在MySQL中创建触发器通过SQL语句CREATE TRIGGER来实现,其语法形式如下:

CREATE trigger trigger_name BEFORE|AFTER trigger_EVENT

ON TABLE_NAME FOR EACH ROW trigger_STMT

在上述语句中,参数trigger_name表示要创建的触发器名;

参数BEFORE和AFTER指定了触发器执行的时间,前者在触发器事件之前执行触发器语句,后者在触发器事件之后执行触发器语句;

参数trigger_EVENT表示触发事件,即触发器执行条件,包含DELETE、INSERT和UPDATE语句;参数TABLE_NAME表示触发事件的操作表名;参数FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器;

参数trigger_STMT表示激活触发器后被执行的语句。执行语句中如果要引用更新记录中的字段,对于INSERT语句,只有NEW是合法的,表示当前已插入的记录;对于DELETE语句,只有OLD才合法,表示当前删除的记录;而UPDATE语句可以和NEW(更新后)以及OLD(更新前)同时使用。

        注意:不能创建具有相同名字的触发器。另外,对于具有相同触发程序动作时间和事件的给定表,不能有两个触发器。因此,对于有经验的用户,在创建触发器之前,需要查看MySQL中是否已经存在该标识符的触发器和触发器的相关事件。

【示例10-1】执行SQL语句CREATE TRIGGER,在数据库school中存在两个表对象:学员表student和班级表 class,创建触发器实现向学员表中插入记录时,就会在插入之后更新班级表中的人数,当我们删除某条学员的记录时,就会在删除后更新班级表中的人数,具体步骤如下:

mysql>  use school;   #选择数据库school                                          

mysql>  CREATE TABLE class (                                                        

  `id` int NOT NULL AUTO_INCREMENT,                                             

  `name` varchar(128) DEFAULT NULL,                                              

  `teacher` varchar(64) DEFAULT NULL, 

  `count`  int DEFAULT 0,                                          

  UNIQUE KEY `id` (`id`)                                                             

);  #创建班级表 class                                                                

mysql> insert into class values(101, '萌新一班', 'Martin', 0),(102, '萌新二班', 'Rock', 0),(103, '萌新三班', 'Janny', 0);  #创建成绩表 grade                                                

mysql>  CREATE TABLE `student` (                                                 

  `id` int NOT NULL AUTO_INCREMENT UNIQUE,                                                           

  `name` varchar(64) DEFAULT NULL,                                               

  `class_id` int DEFAULT NULL,                                                     

  `sex` enum('F','M') DEFAULT NULL                                                 

);

mysql> create trigger tri_insert_student after insert on student for each row update class set count=count+1 where class.id = NEW.class_id;   #创建触发器,新增学员班级人数增1

                                                                               

mysql> insert into student values(1,'小花',101,'M'),(2,'小红',102, 'F'),(3,'小军',102,'F'),(4,'小白',101,'F');  #插入多条记录  

mysql> select count from class  ;  #查询class 表人数 

mysql> create trigger tri_delete_student after delete on student for each row update class set count=count-1 where id = OLD.class_id; #创建触发器,删除学员班级人数减1

触发器包含多条执行语句

              CREATE   trigger trigger_name BEFORE|AFTER trigger_EVENT    

               ON TABLE_NAME FOR EACH ROW                                 

                   BEGIN                                                       

                    trigger_STMT                                                

                   END                                                          

在上述语句中,比“只有一条执行语句的触发器”语法多出来两个关键字BEGIN和END,在这两个关键字之间是所要执行的多个执行语句的内容,执行语句之间用分号隔开。

在MySQL中,一般情况下用“;”符号作为语句的结束符号,可是在创建触发器时,需要用到“;”符号作为执行语句的结束符号。为了解决该问题,可以使用关键字DELIMITER语句。例如,“DELIMITER $$”可以将结束符号设置成“$$”。

mysql>  use school;   #选择数据库school        

mysql>  create table grade(id int UNIQUE AUTO_INCREMENT,  math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned);       #创建成绩表 grade  

mysql> insert into grade values(1, 80, 87, 91),(2, 72, 64, 89),(3, 54, 69, 87),(4, 78, 79, 89);  #插入多条记录                                      

mysql> DELIMITER $$                                                                               

mysql> create trigger tri_delete_student after delete on student for each row

        BEGIN                                   

         Delete from grade where id = OLD.id;  #删除成绩表中的记录                                                        

         update class set count=count-1 where id = OLD.class_id; #更新班级表中的记录  

         END;                                   

         $$                                       

         DELIMITER ;                            

三、查看触发器

        SHOW TRIGGERS语句查看触发器

那么如何查看MySQL软件中已经存在的触发器呢?在MySQL软件中查看已经存在的触发器,通过SQL语句SHOW TRIGGERS来实现,其语法形式如下,执行上面的SQL语句,执行结果如图9-10所示。

          SHOW TRIGGERS ; 

通过图9-10的执行结果可以发现,执行完“SHOW TRIGGERS”语句后会显示一个列表,在该列表中会显示出所有触发器的信息。其中,参数Trigger表示触发器的名称;参数Event表示触发器的激发事件;参数Table表示触发器对象触发事件所操作的表;参数Statement表示触发器激活时所执行的语句;参数Timing表示触发器所执行的时间。

查看系统表triggers实现查看触发器

在MySQL中,在系统数据库information_schema中存在一个存储所有触发器信息的系统表triggers,因此查询该表格的记录也可以实现查看触发器功能。系统表triggers的表结构

mysql>  use information_schema;   #选择数据库information_schema                 

mysql>  select * from triggers;                                                       

mysql>  select * from triggers where trigger_name=’tri_delete_student’; #查询系统表triggers中的触发器                                                                  

四、删除触发器

在MySQL软件中,可以通过DROP TRIGGER语句或通过工具来删除触发器。

在MySQL中,删除触发器可以通过SQL语句DROP TRIGGER来实现,其语法形式如下:

DROP TRIGGER trigger_name;

在上述语句中,参数trigger_name表示所要删除的触发器名称。


总结

以上就是我的总结。

MySQL——超详细数据库触发器教程相关推荐

  1. Mysql学习总结(2)——Mysql超详细Window安装教程

    目录 一.安装包准备 二.开始安装 三.验证安装 四.客户端工具 一.安装包准备

  2. mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程

    这篇文章主要介绍了SQL Server 2008 R2 超详细安装图文教程,需要的朋友可以参考下 一.下载SQL Server 2008 R2安装文件 二.将安装文件刻录成光盘或者用虚拟光驱加载,或者 ...

  3. 超强、超详细Redis入门教程【转】

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...

  4. 【转】超强、超详细Redis入门教程 ,建议收藏

    转载自: 这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3. ...

  5. 超详细的 PyCharm 教程

    本文假设读者熟悉 Python 开发,且计算机中已安装某个版本的 Python.该教程将使用 Python 3.6 版本,屏幕截图和 demo 均来自 macOS 系统.由于 PyCharm 可在所有 ...

  6. Tomcat安装及配置教程(超详细的图文教程)(亲测)

    Tomcat安装及配置教程(超详细的图文教程) 1.什么是Tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下 ...

  7. springboot超详细教程_CG原画插画教程:超详细线稿教程

    艺学绘小编收集整理了超详细线稿教程 今天我们从起稿开始 1. 用圆表示出人物的头部.胸腔和骨盆,分别画出头部的十字线和身体的中线,表示头和身体的朝向.用"火柴棍"表示四肢的动作形态 ...

  8. [转](转载+整理)超详细的cmake教程

    cmake教程 参考 什么是cmake cmake 常见语法罗列 CMake可用变量 入门案例 单个源文件 多个源文件 同一目录,多个源文件 多个目录,多个源文件 进阶案例 自定义编译选项 指定安装和 ...

  9. win10时间不准_【装机教程】超详细WIN10系统安装教程,官方ISO直装与PE两种方法教程...

    P1:官方ISO镜像直装 超详细WIN10系统安装教程 P1https://www.zhihu.com/video/1186597662923718656 P2:微PE辅助安装 超详细WIN10系统安 ...

最新文章

  1. Excel VBA林木冠幅、分枝胸径字符串的拆解
  2. python读取excel-蜗牛笔记-文章-Python读取Excel文件
  3. 《深入理解Java虚拟机》笔记6——高效并发
  4. 全球及中国商用电饭煲行业现状调研及投资决策建议报告2021-2027年版
  5. 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射...
  6. ICCV 2021 Oral | AdaFocus:利用空间冗余性实现高效视频识别
  7. 你是信用卡卡奴吗?怎么摆脱卡奴?
  8. python能做哪些客户端_Python 实现简单的客户端认证
  9. Android使用Application的好处
  10. 【codevs1519】 过路费
  11. 3.分布式服务架构:原理、设计与实战 --- 服务化系统容量评估和性能保障
  12. KVM 介绍(7):使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 (Nova Instances Snapshot Libvirt)
  13. 基于STM32F103C8T6 HAL库 TM7705数据读取
  14. 12种编程语言训练,开源的AI “程序员”来了,CMU出品
  15. 关于电脑网络显示红叉的解决方法
  16. 【语音识别】动态时间规整算法(RTW)语音识别系统【含GUI Matlab源码 341期】
  17. matlab如何弄上标,[转载]在Matlab中怎样输入特殊符号或者上标、下标
  18. 程序员有前途吗?出路在哪里?
  19. 论文笔记-精读-8.24-Pruning neural networks without any data by iteratively conserving synaptic flow
  20. nCode:GlyphWorks案例教程一

热门文章

  1. 优秀简历只需一篇就能打天下
  2. 变形金刚2中的各个角色,及车型(带图)第二篇。
  3. Spark 第三讲 Scala数组与函数基础
  4. STemWin专题--画直线
  5. Java 多态的薪酬计算的练习
  6. vue搭配element, el-input出现高频无法粘贴文本的情况
  7. Unity获取天气最稳定的接口
  8. python高清壁纸_爬虫 抓取王者荣耀所有英雄皮肤高清壁纸(完美版本)
  9. kali使用笔记本自带无线网卡_不会选无线网卡看过来!再也不花冤枉钱了.........
  10. android画笔大小,android之画板功能之橡皮擦 画笔大小和画笔颜色