自动,MySQL触发器,完整详细可收藏

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料)


文章目录

    • 1. 触发器概述
    • 2. 触发器的创建
    • 3. 查看、删除触发器
    • 4. 触发器的优缺点


在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息和库存信息分别存放在2个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时在库存表中添加一条库存记录。这样一来,我们就必须把这两个关联的操作步骤写到程序里面,而且要用事务包裹起来,确保这两个操作成为一个原子操作 ,要么全部执行,要么全部不执行。要是遇到特殊情况,可能还需要对数据进行手动维护,这样就很 容易忘记其中的一步 ,导致数据缺失。这个时候,咱们可以使用触发器。你可以创建一个触发器,让商品信息数据的插入操作自动触发库存数据的插入操作。这样一来,就不用担心因为忘记添加库存数据而导致的数据缺失了。

1. 触发器概述

MySQL从 5.0.2 版本开始支持触发器。MySQL的触发器和存储过程一样,都是嵌入到MySQL服务器的一段程序。

触发器是由事件来触发某个操作,这些事件包括 INSERT 、 UPDATE 、 DELETE 事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会自动激发触发器执行相应的操作。当对数据表中的数据执行插入、更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来实现。

2. 触发器的创建

2.1 创建触发器语法
创建触发器的语法结构是:

CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
触发器执行的语句块;

说明:
①表名 :表示触发器监控的对象。
②BEFORE|AFTER :表示触发的时间。BEFORE 表示在事件之前触发;AFTER 表示在事件之后触发。
③INSERT|UPDATE|DELETE :表示触发的事件。
INSERT 表示插入记录;
UPDATE 表示更新记录;
DELETE 表示删除记录。
④触发器执行的语句块 :可以是单条SQL语句,也可以是由BEGIN…END结构组成的复合语句块。

2.2 代码举例
举例:
①创建数据表:

CREATE TABLE test_trigger (
id INT PRIMARY KEY AUTO_INCREMENT,
t_note VARCHAR(30)
);CREATE TABLE test_trigger_log (
id INT PRIMARY KEY AUTO_INCREMENT,
t_log VARCHAR(30)
);

②创建触发器:创建名称为before_insert的触发器,向test_trigger数据表插入数据之前,向test_trigger_log数据表中插入before_insert的日志信息。

DELIMITER //
CREATE TRIGGER before_insert
BEFORE INSERT ON test_trigger
FOR EACH ROW
BEGININSERT INTO test_trigger_log (t_log)VALUES('before_insert');
END //
DELIMITER ;

③向test_trigger数据表中插入数据

INSERT INTO test_trigger (t_note) VALUES ('测试 BEFORE INSERT 触发器');

④查看test_trigger_log数据表中的数据

mysql> SELECT * FROM test_trigger_log;
+----+---------------+
| id | t_log |
+----+---------------+
| 1 | before_insert |
+----+---------------+
1 row in set (0.00 sec)

3. 查看、删除触发器

3.1 查看触发器
查看触发器是查看数据库中已经存在的触发器的定义、状态和语法信息等。
方式1:查看当前数据库的所有触发器的定义

SHOW TRIGGERS\G

方式2:查看当前数据库中某个触发器的定义

SHOW CREATE TRIGGER 触发器名

方式3:从系统库information_schema的TRIGGERS表中查询“salary_check_trigger”触发器的信息

SELECT * FROM information_schema.TRIGGERS;

3.2 删除触发器
触发器也是数据库对象,删除触发器也用DROP语句,语法格式如下:

DROP TRIGGER IF EXISTS 触发器名称;

4. 触发器的优缺点

4.1 优点
①触发器可以确保数据的完整性。
假设我们用 进货单头表 (demo.importhead)来保存进货单的总体信息,包括进货单编号、供货商编号、仓库编号、总计进货数量、总计进货金额和验收日期。
在这里插入图片描述
用 进货单明细表 (demo.importdetails)来保存进货商品的明细,包括进货单编号、商品编号、进货数量、进货价格和进货金额。
在这里插入图片描述
每当我们录入、删除和修改一条进货单明细数据的时候,进货单明细表里的数据就会发生变动。这个时候,在进货单头表中的总计数量和总计金额就必须重新计算,否则,进货单头表中的总计数量和总计金额就不等于进货单明细表中数量合计和金额合计了,这就是数据不一致。
为了解决这个问题,我们就可以使用触发器,规定每当进货单明细表有数据插入、修改和删除的操作时,自动触发 2 步操作:
1)重新计算进货单明细表中的数量合计和金额合计;
2)用第一步中计算出来的值更新进货单头表中的合计数量与合计金额。
这样一来,进货单头表中的合计数量与合计金额的值,就始终与进货单明细表中计算出来的合计数量与合计金额的值相同,数据就是一致的,不会互相矛盾。

②触发器可以帮助我们记录操作日志。
利用触发器,可以具体记录什么时间发生了什么。比如,记录修改会员储值金额的触发器,就是一个很好的例子。这对我们还原操作执行时的具体场景,更好地定位问题原因很有帮助。

③触发器还可以用在操作数据前,对数据进行合法性检查。
比如,超市进货的时候,需要库管录入进货价格。但是,人为操作很容易犯错误,比如说在录入数量的时候,把条形码扫进去了;录入金额的时候,看串了行,录入的价格远超售价,导致账面上的巨亏。这些都可以通过触发器,在实际插入或者更新操作之前,对相应的数据进行检查,及时提示错误,防止错误数据进入系统。

4.2 缺点
①触发器最大的一个问题就是可读性差。
因为触发器存储在数据库中,并且由事件驱动,这就意味着触发器有可能 不受应用层的控制 。这对系统维护是非常有挑战的。比如,创建触发器用于修改会员储值操作。如果触发器中的操作出了问题,会导致会员储值金额更新失败。我用下面的代码演示一下:

mysql> update demo.membermaster set memberdeposit=20 where memberid = 2;
ERROR 1054 (42S22): Unknown column 'aa' in 'field list'

结果显示,系统提示错误,字段“aa”不存在。这是因为,触发器中的数据插入操作多了一个字段,系统提示错误。可是,如果你不了解这个触发器,很可能会认为是更新语句本身的问题,或者是会员信息表的结构出了问题。说不定你还会给会员信息表添加一个叫“aa”的字段,试图解决这个问题,结果只能是白费力。

②相关数据的变更,可能会导致触发器出错。
特别是数据表结构的变更,都可能会导致触发器出错,进而影响数据操作的正常运行。这些都会由于触发器本身的隐蔽性,影响到应用中错误原因排查的效率。

4.3 注意点
注意,如果在子表中定义了外键约束,并且外键指定了ON UPDATE/DELETE CASCADE/SET NULL子句,此时修改父表被引用的键值或删除父表被引用的记录行时,也会引起子表的修改和删除操作,此时基于子表的UPDATE和DELETE语句定义的触发器并不会被激活。

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

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

相关文章

统计信号处理基础 - 估计与检测理论 估计部分习题3.7公式推导

统计信号处理基础 - 估计与检测理论 估计部分习题3.7公式推导题目证明结论得证题目 相信学习信号检测与估计的童鞋们肯定看到过Steven M.Kay大牛的书,非常厚的一本,不得不说,人家的书就是写得好,浅显易懂(当然是要从头…

机器学习大作业《Kaggle赛题之Kannada MNIST研究》论文和Python代码

一、赛题概述及分析 1、背景介绍 邮政系统每天都会处理大量的信件,最为要紧的一环是要根据信件上的收信人邮编进行识别和分类,以便确定信件的投送地。原本这项任务是依靠大量的人工来进行,后来人们尝试让计算机来替代人工。然而&#xff0c…

neo4j图形界面_图形处理:betweeness中心性– neo4j的密码与graphstream

neo4j图形界面上周, 我写了关于中间性中心算法以及我尝试使用graphstream 理解它的尝试 ,在阅读源代码的同时,我意识到我可以使用neo4j的所有最短路径算法将某些东西放在一起。 概括地说,中间性中心度算法用于确定图中节点的负载…

打开服务器文件提示内存不够,打开服务器文件提示内存不够

打开服务器文件提示内存不够 内容精选换一换本节操作指导您完成Windows操作系统云服务器磁盘空间清理。弹性云服务器匀出一部分磁盘空间来充当内存使用,当内存耗尽时,云服务器可以使用虚拟内存来缓解内存的紧张。但当内存使用率已经非常高时,…

【自适应(盲)均衡1】LMMSE、Godard、CMA常模、Sato等算法在信道均衡中的应用理论与MATLAB仿真(代码见CSDN同名资源)

1.实验背景 考虑如图所示的基带等效数据传输系统,发送符号经过ISI失真信道传输,叠加高斯加性白噪声。 设发送信号采用QPSK调制,即 x k = ( 1 j ) / 2 {x_k} = ( \pm 1 \pm j)/\sqrt 2 x

无线打印机与手机连接到服务器,图文详解手机通过无线Wifi连接打印机的方法...

打印机是我们在办公过程中经常会用到的打印设备,特别是当需要大量的文件资料时,打印机可以帮助我们快速的打印和记录。随着打印机使用的不断广泛,打印机的种类也在不断的增多,为了能够适应现在这个网络智能时代的发展,…

卷积码Viterbi译码算法基本原理及C语言实现

配套代码:https://download.csdn.net/download/wlwdecs_dn/14463620 界面 (3, 1, 3)卷积码状态转移框图 源文件 编码文件: 译码文件:

Win32编程之基于MATLAB与VC交互的幻方阵(魔方阵)输出

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序下载 配套代码下载地址 程序预览 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于double类型,占据空间很大,遇到大型数…

java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法

java中使用es的dsl我们大多数人已经编写了一些处理图论算法的程序,例如找到两个顶点之间的最短路径,找到给定图的最小生成树等等。 在这些算法的每一种中,表示图形的编程方式是使用邻接矩阵或邻接列表 。 两者都不是定义图形输入的非常直观的…

leetcode 495. 提莫攻击(esay)(优质解法)

链接&#xff1a;495. 提莫攻击 代码&#xff1a; class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int time0;for(int i1;i<timeSeries.length;i){if(timeSeries[i]-timeSeries[i-1]<duration){timetimeSeries[i]-timeSeries[i-1];…

基于高阶累积量的数字调制信号分类(Hierarchical Digital Modulation Classification Using Cumulants例1复现)

本文主要来源于2000年Swami经典文献Hierarchical Digital Modulation Classification Using Cumulants中例1的复现(文献共有15个实例,后续例子与例1实现方法类似,有问题欢迎留言),该论文是高阶累积量作信号调制识别分类的开篇之作,后续该方向的文献几乎都引用了Swami这篇…

矩阵可逆的一种刻画方式

问题 若矩阵A满足AATIAA^{\rm{T}}IAATI&#xff0c;则A可逆。 证明一 反证法。假设A不可逆&#xff0c;则 ∃x0≠0\exists{x_0}\ne0∃x0​​0&#xff0c;使得Ax00A{x_0}0Ax0​0&#xff0c;则 x0AT(Ax0)T0T{x_0}{A^{\rm{T}}} {(A{x_0})^{\rm{T}}} {0^{\rm{T}}}x0​AT(A…

我们知道计算机的大小单位有 B, KB, MB 等,现在请你编写一个计算器进行大小单位换算。Java洛谷传智杯

题目描述&#xff1a; 我们知道计算机的大小单位有 B, KB, MB 等&#xff0c;现在请你编写一个计算器进行大小单位换算。 输入格式&#xff1a;输入一个字符串&#xff0c;由一个 0 到 1023 之间的整数&#xff0c;一个单位名称&#xff08;大写字母&#xff09;&#xff0c;一…

传智杯Java志愿者传智专修学院总共召集了n位志愿者来负责打扫活动,现在需要你负责帮忙统计每位志愿者的工作情况,用来制作光荣榜,给他们发小花花

Java实现思路&#xff1a;创建一个志愿者内部类&#xff0c;包括编号、服务时长、难度、贡献度属性。使用ArrayList将多个志愿者对象联系在一起。使用Collection的sort方法&#xff0c;重写compare方法进行按规则比较。 Java代码&#xff1a; import java.util.ArrayList; im…

高斯白噪声下基于EM的多径时延估计

本文主要来源于复现文献的部分内容&#xff0c;有一定的参考价值&#xff1a; [1] 刘波. 基于EM的突发通信参数估计技术研究[D]. 2009. 文末有代码和参考文献网盘下载地址&#xff0c;有问题欢迎留言交流&#xff01; 1 引言 对于多径传播&#xff0c;接收信号是由源信号与它…

传智杯Java终端有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal

Java思路&#xff1a;使用String的字符串处理以及ArrayList的列表处理。 Java代码&#xff1a; import java.util.ArrayList; import java.util.Scanner; public class Main{public static ArrayList<String> list new ArrayList<>();public static void main(S…

新年迈出Java后台服务器与数据库交互第一步2022最新通用Java8jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作

文章目录一、JDBC下载与导入二、获取连接三、PreparedStatement类操作数据库四、操作BLOB类型字段&#xff08;图片视频等&#xff09;五、Batch批量插入&#x1f646;&#x1f3fb;‍♀️&#x1f646;&#x1f3fb;‍♀️文末最新版jdbc jar包下载 &#x1f646;&#x1f3fb…

最优化理论与算法笔记

最优化理论与算法笔记

Win32编程之基于MATLAB与VC交互的多项式回归

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于d…