深入浅出解析——MYSQL|触发器

news2024/11/29 8:48:28

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。


💅文章概要:触发器是一个被指定关联到-个表的过程式数据库对象,当对一个表的特定事件出现时,它将会被激活。触发器具有MySQL语句在需要时才被执行的特点,即某条(或某些)MySQL语句在特定事件发生时自动执行,本文主要介绍一下MYSQL中六种触发器的案例。


🤟每日一言:只有你爬到山顶了,这座山才会支撑着你。

目录

1.触发器概念

2.触发器的类型

3.触发器的创建

4.触发器实例的创建和使用

(一). after insert触发器实例

(二). before insert触发器实例

(三). after delete触发器实例

(四). before delete触发器实例

(五). after update触发器实例

(六). before update触发器实例

5.触发器的删除


文章概要

1.触发器概念

2.触发器类型

3.触发器的创建

4.触发器实例的创建和使用

5.触发器的删除


1.触发器概念

触发器是一个被指定关联到-个表的过程式数据库对象,当对一个表的特定事件出现时,它将会被激活。触发器具有MySQL语句在需要时才被执行的特点,即某条(或某些)MySQL语句在特定事件发生时自动执行。例如:

●每当增加一个客户到数据库的客户基本信息表时,都检查其电话号码的格式是否正确。
●每当客户订购一个产品时,都从产品库存量中减去订购的数量。
●每当删除客户基本信息表中一个客户的全部基本信息数据时,该客户所订购的未完成订单信息也应该被自动删除。
●无论何时删除一行,都在数据库的存档表中保留一个副本。

触发器与表的关系十分密切,用于保护表中的数据。当有操作影响到触发器所保护的数据时,触发器就会自动执行,从而保障数据库中数据的完整性,以及多个表之间数据的一致性。具体而言,触发器就是MySQL响应INSERT、UPDATE和DELETE语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组MySQL语句)。需要注意的是,其他MySQL语句是不支持触发器的。


2.触发器的类型

● INSERT触发器
INSERT触发器可在INSERT语句执行之前或者之后执行,在INSERT触发器内可引用一个名为NEW的虚拟表来访问被插入的行,NEW的值可以被更新

● DELETE触发器
DELETE触发器可在DELETE语句执行之前或者之后执行,在DELETE触发器内可引用一个名为OLD的虚拟表来访问被删除的行,OLD的值不可以被更新,全部是只读的

● UPDATE触发器
UPDATE触发器可在UPDATE语句执行之前或者之后执行,在UPDATE触发器内可引用一个名为NEW的虚拟表来访问被更新的行,也可以引用一个名为OLD的虚拟表来访问更新之前的行,OLD的值全部只读,NEW的值可以被更新


3.触发器的创建

在MYSQL中,创建触发器的一般语句是:

CREATE
    TRIGGER trigger_name trigger_time trigger_event
    ON tb_name FOR EACH ROW  trigger_body

其中:各参数介绍如下

trigger_name
触发器名称,用来区分不同的触发器,名称在当前数据库是唯一的
trigger_name
触发器触发的时间点,有两个参数可选:BEFORE和UPDATE。一般来说,BEFROE节点用于在执行语句执行前对触发器进行调用,AFTER节点用于在执行语句执行后对触发器进行调用。
trigger_event
触发器的事件,有三个参数可以选择:INSERT,DELETE和UPDATE
tb_name
触发器要作用的的数据表
trigger_body
触发器的主体执行语句,可以使用BEGIN...END复合语句结构,下面代码实例中均采用该种复合语句结构

因为触发器的创建和使用不能分割开来,每一个触发器的创建和调用都需要根据具体的实例创建,所以触发器实例的创建和使用全部在下一小节讲解


4.触发器实例的创建和使用

(一). after insert触发器实例

(给定了表tbl_student和tbl_teacher,每次向tbl_student表插入一条新的记录后,自动向tbl_teacher表中赋值"Frank"老师的名字)

1. 表单结构
tbl_student

表一.png


tbl_teacher

表2.png


2. after insert触发器的创建

DELIMITER //
CREATE TRIGGER after_insert_trigger AFTER INSERT ON tbl_student FOR EACH ROW
begin 
   INSERT INTO tbl_teacher VALUES("Frank");
end//
DELIMITER ;

3. 效果展示

效果.png


(二). before insert触发器实例


(给定了表tbl_student,每次向tbl_student表插入一条新的记录后,将新插入的记录都更新为"123")

ps: before insert触发器一般用于更新new的值和检查数据


1. 表单结构
tbl_student

表一.png


2. before insert触发器的创建

DELIMITER //
CREATE TRIGGER before_insert_trigger BEFORE INSERT ON tbl_student FOR EACH ROW
begin       
     set new.stu_id = "123";
end//
DELIMITER ;

3. 效果展示

效果2.png


(三). after delete触发器实例


(给定了表tbl_student和tbl_teacher,每次删除tbl_student表中的记录后,自动删除tbl_teacher表中的所有记录)
1. 表单结构
tbl_student

表一.png


tbl_teacher

表2.png


2. atfer delete触发器的创建

DELIMITER //
CREATE TRIGGER after_delete_trigger after delete ON tbl_student FOR EACH ROW
begin       
    delete from tbl_teacher;
end//
DELIMITER ;

3. 效果展示

效果3.png


(四). before delete触发器实例


(给定了表tbl_student和tbl_student_2,每次删除tbl_student表中的记录后,自动备份该条记录到tbl_student_2表中)
1. 表单结构
tbl_student

表一.png


tbl_student_2

表3.png


2. before delete触发器的创建

DELIMITER //
CREATE TRIGGER before_delete_trigger before delete ON tbl_student FOR EACH ROW
begin       
    insert into tbl_student_2 values(old.stu_id);
end//
DELIMITER ;

3. 效果展示

效果4.png


(五). after update触发器实例


(给定了表tbl_student和tbl_student_2,每次更新tbl_student表中的记录后,自动备份该条记录到tbl_student_2表中)
1. 表单结构
tbl_student

表一.png


tbl_student_2

表3.png


2. after update触发器的创建

DELIMITER //
CREATE TRIGGER after_update_trigger after update ON tbl_student FOR EACH ROW
begin       
    insert into tbl_student_2 values(old.stu_id);
end//
DELIMITER ;

3. 效果展示

效果5.png


(六). before update触发器实例


(给定了表tbl_student,每次更新tbl_student表中的记录后,自动修改其自身表中stu_id 所对应老师的名字为'Frank')

ps: before update触发器一般用于更新表自身中的数据


1. 表单结构
tbl_student

表4.png


2. before update触发器的创建

DELIMITER //
CREATE TRIGGER before_update_trigger before update ON tbl_student FOR EACH ROW
begin       
    set new.tea_name = 'Frank';
end//
DELIMITER ;

3. 效果展示

效果6.png


5.触发器的删除

在MYSQL中,删除触发器的一般语句是:

DROP TRIGGER [IF EXISTS] trigger_name

其中:各参数介绍如下

[IF EXISTS]
可选项,用于避免在没有触发器的情况下删除触发器
trigger_name
要删除的触发器名称

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AtCoder Beginner Contest 279 F BOX 并查集 (大意失荆州

前言 赛时一直RE,思路很清晰,不知道RE哪里。。qwq 赛后开断点发现,map的大小不变, 最后发现是一个if条件写错了,寄。 不知道为什么会想起 银河英雄传说 题意: 初始n个盒子,盒子iii放着编号为i…

2023年天津财经大学珠江学院专升本退役士兵免试职业技能考查大纲

天津财经大学珠江学院2023年高职升本科职业技能综合考查考试大纲 (仅适用于符合条件的退役士兵考生)《管理学原理》 一、本大纲系天津财经大学珠江学院2023年高职升本科《管理学原理》职业技能综合考查考试大纲,仅适用于符合条件的退役士兵考…

面试官:synchronized与Lock有什么区别?

作为一名程序员,在求职面试时,不知道你在求职面试时常会遇到关于线程的问题。张工是一名java程序员,3年多工作经验,有次到一家互联网公司面试软件开发工程师岗位,面试官就问了他这样一个问题。synchronized与Lock有什么…

Android APP深度优化—内存映射机制(mmap)

mmap原理 open一个文件,然后调用mmap系统调用,将文件的内容的全部或一部分直接映射到进程虚拟空间中文件存储映射部分;完成映射关系后,mmap返回值是一个指针,进程可以通过采用指针方式读写操作这一段内存;…

vue3 antd项目实战——使用filter实现简单的table表格搜索功能

零基础filter实现最简单的table表格知识调用核心干货下期预告关键字模糊查找(纯前端)关键字模糊查找(前后交互)知识调用 功能实现可能要用到的知识:vue3ant design vuets实战【ant-design-vue组件库引入】vue3项目实战…

MyBatis-Plus删除操作知识点总结

系列文章目录 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客MyBatis-Plus中的更新操作&#xf…

移动无线点餐客户端的研究与实现(Java+Android)

目录 1 绪 论 2 1.1 研究的背景及意义 2 1.2 本文主要内容 2 2.1 系统架构 3 2.2 关键技术 3 2.2.1 JDBC 3 2.2.2 Jquery 4 2.2.3 Ajax 4 2.3 开发环境及平台 5 2.3.1 Eclipse 5 2.3.2 MyEclipse 6 2.3.3 Tomcat服务器 6 2.3.4 应用平台Android 7 3 订餐系统分析与设计 9 3.1需…

机器学习:图文详解密度聚类DBSCAN算法(附Python实现)

目录0 写在前面1 密度聚类2 DBSCAN算法3 Python实现3.1 算法复现3.2 可视化实验0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树…

C#线程间操作无效:从不是创建控件“textbox1”的线程访问它

在C#的多线程访问中,在线程间的相互访问时因为线程安全问题有访问限制,在创建一般线程时,对于界面元素访问时这样的问题比较常见。 比如,创建一个form1,上面放置一个textbox控件,创建一个线程去访问textbox…

3_SpringMVC_执行流程

1DispatcherServlet:前端控制器 用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。 2…

【学习笔记43】JavaScript的事件

JavaScript的事件一、JS的事件1、事件的三要素2、DOM 0级事件绑定3、DOM 2级事件绑定(事件监听)二、浏览器事件三、鼠标事件1. 左键单击:click2. 双击事件:dblclick3.右键事件:contextmenu4. 鼠标按下事件:mousedown5. 鼠标抬起事…

编写Servlet代码获取页面body中json数据

目录 1、在 maven 项目中引入 jackson 2、编写代码 ① 介绍 jackson 提供操作 json 数据的类和方法 ② 确定 json 数据格式,并写出对应的类 ③ 编写servlet代码 3、使用 postman 发送数据观察结果 4、拓展 readValue 方法返回构造对象的过程 本文使用maven项目&…

HTML5详解

文章目录1 网页基本标签1.2 标题标签1.3 段落标签1.4 换行标签1.5 水平线标签1.6 字体样式标签1.7 注释和特殊符号2 图像、超链接、网页布局2.1 图像2.2 超链接标签2.3 块元素和行内元素2.4 网页布局3 列表、表格、媒体元素、iframe内联框架3.1 列表3.2 表格3.3 媒体元素3.4 if…

Unity 之 安卓堆栈跟踪和日志工具 (Android Logcat | 符号表解析Bugly捕获)

Unity 之 日志解析工具 Android Logcat一,工具集成1.1 注意事项1.2 导入插件二,连接设备2.1 使用USB连接2.2 无线连接三,实用功能介绍3.1 通用介绍3.2 堆栈跟踪工具 -- 解析Bugly捕获报错一,工具集成 Logcat是开发者必备的工具&a…

ps,查看Linux系统进程信息小帮手-尚文网络xUP楠哥

~~全文共852字,阅读需约5分钟。 进Q群11372462,领取专属报名福利,包含云计算学习路线图代表性实战训练大厂云计算面试题资料! ps命令在Linux系统中非常的常用,主要是帮助我们查看系统进程的详细信息,其中,…

Jetson Nano如何安装 onnxruntime gpu Python包

Jetson Nano 可以直接 pip 安装 cpu 版本的 onnxruntime 用 pypi 的源,直接安装 onnxruntime-gpu 或者 onnxruntime_gpu 都会报找不到对应的架构 aarch64 本来以为要用官方库编译一下 https://github.com/microsoft/onnxruntime 幸运的是,NVIDIA官方帮…

地级市市场化指数+樊纲市场化指数(包含分省、市两份数据)

一、地级市市场化指数 1、数据来源:各省份年鉴以及地级市统计公报 2、时间跨度:1998-2020年 3、区域范围:422(城市和区) 4、指标说明: 依据樊纲市场化各指标,结合各地级市的相关数据算出来…

Typecho中handsome主题如何增加侧边导航栏

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

【心电信号】小波阙值心电信号去噪【含Matlab源码 2188期】

⛄一、小波阈值法去噪概述 电能质量扰动信号的噪声大多以高斯白噪声的形式存在,利用小波变换对信号进行多分辨率分解,由于小波变换具有去除数据相关性的特点,故可以将有用信号与噪声的能量分离开来。信号中有效的信息主要集中在较大的小波系…

【Vue】Vuex-store

Vuex是什么? Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享。 像一个仓库一样! 使用Vuex统一管理状态的好处? 1.能够在vuex中集中管理共享的数据,易于开发和后期维护 2.能…