MySQL触发器(转载)

触发器(trigger)是数据库中的一个很重要的、很实用的基于事件的处理器,在处理一些业务需求的时候,使用触发器会很方便。似乎在《高性能MySQL》中,对触发器作了一定的描述,也提到使用中的一些优势和局限性,但感觉还是不能完全理解触发器的全部功能和实现。于是自己在网上看了一些文章,结合官网(https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html)中的案例,写下这篇总结。

 

基本理解:

1. 使用场合:

触发器是基于事件的,主要的事件也就是MySQL的增删改操作,即insert,delete,update。

2. 触发器的命名

Trigger names exist in the schema namespace, meaning that all triggers must have unique names within a schema. Triggers in different schemas can have the same name.

因为触发器在单表的命名空间内,所以同一个表的触发器名称需要不同。不同表可以有相同的触发器名称。

3. 触发器执行顺序

如果有相同的update(或者delete,insert)触发器,就会按照创建的时间来执行。

而FOLLOWS 和 PRECEDES 可以修改trigger的执行顺序

例如官方的案例:

mysql> CREATE TRIGGER ins_transaction BEFORE INSERT ON account

       FOR EACH ROW PRECEDES ins_sum

       SET

       @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),

       @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);

Query OK, 0 rows affected (0.01 sec)

 

ins_transaction和ins_sum分别是两个触发器的名称。

 

4. 触发器的作用

1. 安全性。可以基于数据库的值使用户具有操作数据库的某种权利。

1)可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。

2)可以基于数据库中的数据限制用户的操作,例如不允许单个商品的购买量大于一个固定值。

2. 审计。可以跟踪用户对数据库的操作。  

 1)审计用户操作数据库的语句。

 2)把用户对数据库的更新写入审计表。

这一块因为本人没有用过,就不赘述了,以后有机会来补充

3. 实现复杂的数据完整性规则

实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。

4. 实现复杂的非标准的数据库相关完整性规则。

1)触发器可以对数据库中相关的表进行连环更新。这是用得比较多的一种实现功能。

2) 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起作用。

下面的例子我会比较详细的描述这两个特性。

5. 同步实时地复制表中的数据。

6. 自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。

例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。

 

1)插入数据:

当用户添加一个订单的时候,我们需要对商品表格中的库存(storage)进行相应的改动

复制代码
 
复制代码

 

查询结果:

复制代码
 
复制代码

 

关于newold的使用

new表示新的数据行,而old表示旧的数据行

 

2)删除数据

例如,用户撤销一个订单的时候,我们需要将商品的数量加回去

 

复制代码
 
复制代码

 

 

结果:

 

 

3)更新数据(可增可减)

当用户对想通过修改购物车的数量来修改自己购买某种商品的数量,那么,我们的库存也需要跟着改动。

 

查看触发器命令

show triggers

这个命令只能看到都有哪些的triggers,而看不到trigger的具体信息。

 

所有触发器信息都存储在information_schema数据库下的triggers表中,可以使用SELECT语句查询。如果有很多个触发器,最好通过TRIGGER_NAME字段指定查询某一个触发器。

例如:

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='XXX';

 

 

(4)限制条件

条件限制对一些涉及到金额的场合(如开篇提到的)非常重要,在电商的限购数额中也会有应用。

trigger利用delimiter,begin和if语句块实现限制条件。

复制代码
 
复制代码

条件语句程序块用begin和end包裹起来实现

delimiter:切换结束符,因为;是MySQL中默认的结束符,如果程序块中出现;符号,就会引起冲突。最后要将结束符修改回来。注意delimiter与结束符之间有空格,否则会无法切换。

 

更新数据前:

 

更新数据:

 

更新数据后:

购买量无法超过3

 

 

关于触发器与事务

对于事务表(Innodb),before语句后面的判断语句失败将会导致回滚事件语句执行的所有更改。触发器失败会导致语句失败,因此触发器失败也会导致回滚。对于非事务性表(MyISAM),无法执行此类回滚,因此尽管语句失败,但在错误点之前执行的任何更改仍然有效。

 

关于触发器的使用限制

触发器执有一些限制:

1. 触发器不能使用CALL 语句来将数据返回给客户端或使用动态SQL的存储过程。但允许存储过程通过OUT或INOUT 参数将数据返回到触发器 。

2. 触发不能使用事务相关的语句,如 START TRANSACTION,COMMIT或ROLLBACK。因为触发器对update,delete,insert等事件做了处理,并且是按照before,SQL语句,after的顺序来执行的,一旦某一步出错,就会回滚数据。如果在触发器中使用事务,就会产生矛盾。

转载于:https://www.cnblogs.com/moondev/p/10188714.html

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

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

相关文章

神级bug解决方法

真的是神级bug,util包中的Arrays类导入不了&#xff0c;一直报错。原因&#xff1a;JDK 1.8和Myeclipse 8.5不兼容&#xff0c;导致java.util.Arrays类无法被编译。所以报错。解决方法&#xff1a;1.降低jdk版本。2.升高Myeclipse版本转载于:https://www.cnblogs.com/yanlongw/…

es6注意点

补救方法&#xff1a; 详情&#xff1a;http://es6.ruanyifeng.com/#docs/array 取出文本内容 实现深拷贝 jq实现不完全深拷贝 jQuery.extend jQuery.fn.extend function () {var options, name, src, copy, copyIsArray, clone,target arguments[0] || {},i 1,length ar…

input标签用法解读

HTML5/HTML中标签用法解读 OK&#xff01;今天博主为小伙伴们介绍的内容是HTML5/HTML中标签的用法&#xff0c;&#xff0c;&#xff0c; &#xff0c;emmm图文并茂哦&#xff01; 下面正式开始内容的介绍&#xff1a;首先&#xff0c;直观上说标签规定了用户可以在其中输入数据…

软件开发文档整理(之)一张示意图 | 清晰明了

在整个软件开发周期&#xff0c;开发文档是必不可少的资料&#xff0c;它们贯穿于整个开发周期&#xff0c;用来评估计划、规划进度、项目管理、软件测试、软件发布&#xff0c;可以说至关重要。   开发文档必须归档&#xff0c;没有归档的文档作用大打折扣&#xff0c;时效性…

《SQL Server 2008从入门到精通》--20180717

目录 1.触发器1.1.DDL触发器1.2.DML触发器1.3.创建触发器1.3.1.创建DML触发器1.3.2.创建DDL触发器1.3.3.嵌套触发器1.3.4.递归触发器1.4.管理触发器1.触发器 触发器是一种特殊的存储过程&#xff0c;与表紧密关联。 1.1.DDL触发器 当服务器或数据库中发生数据定义语言&#xff…

主成分分析原理解释(能力工场小马哥)

主成分分析&#xff08;Principal components analysis&#xff09;-最大方差解释 在这一篇之前的内容是《Factor Analysis》&#xff0c;由于非常理论&#xff0c;打算学完整个课程后再写。在写这篇之前&#xff0c;我阅读了PCA、SVD和LDA。这几个模型相近&#xff0c;却都有自…

vue全面介绍--全家桶、项目实例

简介 “简单却不失优雅&#xff0c;小巧而不乏大匠”。 2016年最火的前端框架当属Vue.js了&#xff0c;很多使用过vue的程序员这样评价它&#xff0c;“vue.js兼具angular.js和react.js的优点&#xff0c;并剔除了它们的缺点”。授予了这么高的评价的vue.js&#xff0c;也是开…

吴恩达机器学习笔记 —— 9 神经网络学习

本章讲述了神经网络的起源与神经元模型&#xff0c;并且描述了前馈型神经网络的构造。 更多内容参考 机器学习&深度学习 在传统的线性回归或者逻辑回归中&#xff0c;如果特征很多&#xff0c;想要手动组合很多有效的特征是不现实的&#xff1b;而且处理这么大的特征数据量…

vue.js开发环境搭建

环境准备 Node.js Javascript的运行时环境npm Node.js下的包管理工具webpack 前端资源模块化管理和打包工具vue-cli 脚手架构建工具cnpm npm的淘宝镜像 Vue.js安装 Node.js的安装非常容易&#xff0c;首先从官网下载你所需操作系统的版本&#xff0c;然后一直下一步就ok&…

正则基础知识

创建正则表达式 1.使用new来创建 var exp new RegExp(box , gi );g 全局匹配 i 忽略大小写 m 多行匹配2.使用字面量 var exp /box/gi; 直接用2个 / ; 在俩个斜杠后加上模式修饰符&#xff1b; 俩种创建方式比较: 1.使用字面量方式创建用的更加广泛; 2.当要匹配的内容是变量时,…

Promise实践

var doSomething function() { return new Promise((resolve, reject) > { resolve(返回值); }); };let doSomethingElse function() { return 新的值; }doSomething().then(function () { return doSomethingElse(); }).then(resp > { console.warn(resp); console.wa…

JsonBuilder初出茅庐

互联网这股东风不久前刮到了甘凉国&#xff0c;国王老甘独具慧眼&#xff0c;想赶紧趁着东风未停大力发展移动互联网&#xff0c;因为他笃信布斯雷的理论&#xff1a;“站在风口上&#xff0c;猪都能飞起来”。无奈地方偏僻落后&#xff0c;国内无可用之才啊。老甘一筹莫展的低…

Nexus介绍

转自&#xff1a;https://www.cnblogs.com/wincai/p/5599282.html 开始在使用Maven时&#xff0c;总是会听到nexus这个词&#xff0c;一会儿maven&#xff0c;一会儿nexus&#xff0c;当时很是困惑&#xff0c;nexus是什么呢&#xff0c;为什么它总是和maven一起被提到呢&#…

vue-cli 打包

一项目打包 1 打包的配置在 build/webpack.base.conf.js文件下 常量config在vue/config/index.js 文件下配置&#xff0c;__dirname是定义在项目的全局变量&#xff0c;是当前文件所在项目的文件夹的绝对路径。 2 需要修改vue/config/index.js 文件下的将build对象下的assets…

乘风破浪:LeetCode真题_010_Regular Expression Matching

乘风破浪&#xff1a;LeetCode真题_010_Regular Expression Matching 一、前言 关于正则表达式我们使用得非常多&#xff0c;但是如果让我们自己写一个&#xff0c;却是有非常大的困难的&#xff0c;我们可能想到状态机&#xff0c;确定&#xff0c;非确定状态机确实是一种解决…

vue项目工程中npm run dev 到底做了什么

npm install 安装了webpack框架中package.json中所需要的依赖 2.安装完成之后&#xff0c;需要启动整个项目运行&#xff0c;npm run 其实执行了package.json中的script脚本&#xff0c;npm run dev的执行如下 3.底层相当执行webpack-dev-server --inline --progress --confi…

bat等大公司常考java多线程面试题

1、说说进程,线程,协程之间的区别 简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程.进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高.线程是进程的一个实体,是cpu调度和分派的基本单位,是比…

offset系列,client系列,scroll系列回顾

一 scroll系列属性 ——滚动1 scrollHeight/scrollWidth 标签内部实际内容的高度/宽度ele.scrollHeight 有两种情况&#xff0c;当内容超出盒子范围后&#xff0c;返回的是内容的高度&#xff0c;包括padding&#xff0c;从顶部内侧到内容的最外部分。当内容不超出盒子范围…

项目开发中的自我总结

最近忙的要死,因为新开发了两个项目.现在已经测试完毕了,准备部署到线上了. 然后不能白忙活吧,忙活完也得写点总结和经验吧,以后也有个记录. 1.一个bootstrapjquerylayuilaravel 5.4开发的一个后台系统 比较朴素 2.一个前后端分离的vuelaravel 5.4 开发的商家系统 我只负责后端…

数组黑科技(偏性能方面)未完待更新...

数组去重最优解&#xff1a;Array.prototype.unique function () {var tmp new Map();return this.filter(item > {return !tmp.has(item) && tmp.set(item,1);})}搭配使用 Array.from(foo); // ["f", "o", "o"]let s new Set([f…