当前课程知识点:数据库技术应用 > 学习情境四、银行存取款机数据库编程 > 模块2、银行存取款机触发器 > 4.2.1INSERT触发器
大家好
欢迎来到数据库技术应用开放课程
今天的任务是insert触发器
我们需要创建一个insert触发器
实现当进行银行自动存取款机存取款操作的时候
自动修改余额
为什么需要触发器
典型的应用其实就是银行的存取款机系统
比如说张三开户一千元
李四开户一元
那么张三支取二百元后
余额自动应该修改为八百元了
在这个过程当中
最优的解决方案就是用触发器
因为它是一种特殊的存储过程
他不需要调用是可以自动执行的
和我们前面讲的存储过程来比他是有一定的优越性的
那么第二个它具有事物的特征
也就是它是一系列操作的集合
要么都做要么都不做
不做的时候可以进行回滚
接下来他还能实现多表之间特殊的业务规则
比如说我们在这个例子当中
就涉及到了交易信息表
还涉及到了我们的帐户信息表
所以本节课的目标
是让大家理解触发器的优点
掌握insert的触发器的创建方法
我们一起进入知识技能的学习
首先我们来看一下触发器的基本概念
触发器是对表进行插入更新
删除操作时自动执行的存储过程
一会儿大家会看见关键字是trigger
trigger的是手枪扳机的意思
大家小的时候都玩过手枪
那么扳机就是一抠扳机子弹就会射出去
所以在我们的触发器当中
我可以用一个成语来解释触发器叫一触即发
所以在触发器的解决方案执行过程当中
我们在设计这个解决方案的时候需要知道
触发的原因是什么
触发的结果是什么
这是我们设计的一个重点
那触发器的特点刚刚咱们已经简单说过了
包括他可以实现多表之间特殊的业务规则
它是自动执行的存储过程
它还具备事物的功能
那触发器怎么创建
我们来看一下它的语法结构
create 关键字trigger
后面跟上触发器的名称
在接下来是触发的时间
然后是触发事件on表名
for each row触发器动作
这里面出发的时间就是我们熟悉的
after或是before
表示触发器是在激活他的语句之前还是之后进行触发
而这个触发事件
是指明了激活触发程序的语句的类型
可以有下面三种情况
可以是insert
大家都知道是插入
也就是将新行插入表时激活触发器
也可以是update更改某一操作的时候激活触发器
还可以是delete删除数据的时候激活触发器
那么触发器的动作包含触发器激活时将要执行的语句
如果要执行多个语句
可以使用begin end复合语句结构
把他圈住,作为一个语句块来出现
那么在这个触发器的设计和执行过程当中
有一个非常重要的概念叫临时表
在触发器里面mysql提供了两个临时表
一个是new一个是old
new是用来存放待插入的数据
old是用来存放待删除的数据
所以后面我们在用触发器的过程当中可以用new点列名 old点列名
进行一个列名的引用
那对于insert语句来说只有new是合法的
而对于delete语句来说只有old是合法的
那对于update语句什么是合法的
大家想一下所谓的update修改
实际上就是把旧的删掉了
把新的插进来了
所以对于update 语句来说new和old是需要同时使用的
那我们一起来实施任务
对于自动修改余额来说
我们需要知道触发的原因是什么触发的结果是什么
在这个问题当中
触发的原因就是你的存取款操作
我去刷卡然后点存款或者取款这么一个操作
也就是说产生了一个交易信息
那触发的结果是什么
就是我们的帐户信息表当中余额的一个修改
所以在这里面涉及到两张表
一张表叫cardinfo表另外一张表transinfo表
那我们来看一下代码怎么来做
先是delimter还是变更我们的结束符
然后用create trigger后面跟上我们的触发器名称
然后after insert就是在你交易信息表当中
插入数据之后触发我们的动作
所以是after insert
那触发原因是哪个表
transinfo 表
on transinfo就是当你的交易信息表当中
有一条数据插入的时候才会触发后面的一些相关操作
所以是transinfo表 for each row
begin end中间是我们的触发的结果
什么结果
是余额的修改
那余额的修改其实就是两种情况
要么是余额减少了要么是余额增加了
所以就是update select where 做了一个减法和加法的问题
但是我们需要进行判断
如果new . transType等于支取
那么update set where就做了一个减法
注意有条件where cardID等于new . cardID
所以大家看这里面我用到了临时表new
为什么要用new
是因为咱们说了提供这样一种机制
当然从业务的角度来说
我们在交易的时候并不能保证你这个交易一定是成功的
所以触发器有一个机制
就是他把你待插入的这条数据先放在临时表当中来存放
然后去验证这个业务
如果说满足业务的需求好了真正的实现插入
如果不满足业务的需求那我要进行回滚
就是刚刚咱们说的具备事物的特征
所以这些数据现在是在临时表里的
我取的时候就得从临时表当中来取
所以大家看到了我们都用的是
new . transmoney
new . cardID
那相反
else
那不是支取
就是存入呗
Update set where做了一个加法操作
这样的话endif我们的选择分支结构结束
然后存储过程结束,就可以实现我们刚才说到这个任务
当你有一条交易记录的时候
自动去修改表里的余额
那么大家现在想一下是不是刚才咱们说的三个特点
第一个自动执行不需要调用
第二个具备事物的特征如果中间出现一些意外
那么就要进行回滚 什么都不做
如果说执行成功好了我修改余额
第三个涉及到两个表的关联
包括我们的cardinfo和transinfo两张表的一个关联关系
所以最典型的或者说最好的一个解决方案
在这个问题当中
用到的就是触发器
是我们触发器当中的insert触发器
那么触发器做好了
我想看结果那需要测试测试的时候
他不需要调用了直接就可以测试了
那怎么测试当你有交易信息的时候
才会触发相应的动作
所以测试的时候我就向交易信息表
transinfo当中插入一条数据
大家看我插入的是支取二百元
那么我再select * from transinfo的时候
这条记录就已经插进去了
那select * from cardinfo的时候
就可以把现在这个卡号对应的余额减去二百元了
大家下去可以自己去测试一下
那么我们在配套资源当中还有一个互动的动画
来体验这个整个取款的过程理解触发器的概念
大家下去可以去用用
那么同时需要大家思考一下
为什么有的同学设计的触发器
他的钱会越取越多正常是越取越少的
但是他是越积越多的
看看哪儿有问题了大家下去想一想
那么今天的拓展任务
是员工管理数据库当中颜色的触发器的应用
感谢大家的聆听
-模块1、数据库的基础知识
--数据库的基础知识
-模块2、MYSQL介绍与安装
--MYSQL介绍与安装
-模块3、银行存取款机数据库的创建与维护
--银行存取款机数据库的创建与维护
-模块4、银行存取款机数据库的设计
--银行存取款机数据库的设计
-模块1、表的创建
--2.1表的创建
--表的创建
-模块2、表的管理
--2.2表的管理
--表的管理
-模块3、索引
--2.3索引
--索引
-实践小课堂:宠物电商管理平台数据库和表的创建
-模块1、银行存取款机数据插入、修改和删除
--银行存取款机数据插入、修改和删除
-模块2、银行存取款机简单查询
--银行存取款机简单查询和统计查询
-模块3、银行存取款机连接查询
--3.3连接查询
--银行存取款机连接查询
-模块4、银行存取款机子查询
--3.4子查询
--银行存取款机子查询
-模块5、银行存取款机分类汇总与排序
--银行存取款机分类汇总与排序
-模块6、银行存取款机视图
--银行存取款机视图
-模块1、银行存取款机存储过程
--4.1.2事务
--银行存取款机存储过程
-模块2、银行存取款机触发器
--银行存取款机触发器
-模块1、MYSQL用户管理
--MYSQL用户管理
-模块2、MYSQL权限管理
--MYSQL权限管理
-模块3、MYSQL数据库的锁机制
--MYSQL数据库的锁机制
-模块4、MYSQL备份和恢复
--MYSQL备份和恢复