MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)
关于触发器的理解:
进行数据库应用软件的开发时,有时我们碰到表的某些数据的改变时,希望同时
引起其他相关数据改变的需求,利用触发器就能满足这样的需求。
触发器能在表中的某些特定数据变化时自动完成某些查询,运用触发器不仅仅可以
简化程序,而且可以增加程序的灵活性
触发器是一类特殊的事务:
可以监视某种数据的操作(insert/update/delete)
并触发相关的操作(insert/update/delete)
需求:
商品表:goods
订单表:ord
当下一个订单时,对应的商品要相应减少(买几个商品就少几个库存)
分析:
监视谁:ord
监视动作:insert
触犯时间:after
触发时间:update
mysql> create table goods(
-> gid int,
-> name varchar(20),
-> num smallint-> )engine myisam charset utf8;
Query OK, 0 rows affected (0.07 sec) mysql> create table ord(
-> ord int,
-> gid int,
-> much smallint
-> )engine myisam charset utf8;
Query OK, 0 rows affected (0.07 sec)
mysql> insert into goods
-> values
-> (1, 'cat', 14),
-> (2, 'dog', 65),
-> (3, 'horse', 21);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0


当我买了2只猫后, 如果没学过触发器,应该把num的值减2;

而利用触发器,则会使步骤变得智能
mysql> delimiter $ # ‘$’分割符是为了与‘;’做出区别
mysql> create trigger t1 #创建一个触发器
-> after # 在insert后触发
-> insert # 触发条件
-> on ord # 在哪个表建立触发条件
-> for each row
-> begin # 开始
-> update goods set num = num - 2 where gid = 1; # 触发后改变的
-> end$ # 结束
Query OK, 0 rows affected (0.13 sec)


在这个例子中,在每在ord中添加一条记录后,goods表的cat行num都会减2;但无论你在ord表内添加任何信息,goods表的cat行num只会减2
优化只能减cat的num-2的问题
触发器引用变量
我们下ord表中,插入的一行叫做new,删除一行叫做old 
如果直接添加会报如下的错误,因为在同一张表中还不支持建立相同触发条件的多个触发器
删除trigger

建立更“智能”的trigger

当建立好t2时,我们来测试一下

建立一个t3,实现退货系统(不会t2冲突吗)


修改订单数据



当要购买的数量大于库存数时,就会出现问题

说明必须在实现该条语句之前,就把数据改为 new.much = 最大的储存量;



MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)的更多相关文章
- MySql cmd下的学习笔记 —— 有关select的操作(in, and, where, like等等)
为方便本节学习, 请先自行建立本表: 建一个商品表: create table goods ( -> goods_id mediumint(8) unsigned not null auto_i ...
- MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)
engine 引擎就是MySQL存储数据的不同方式 myisam 插入速度快 支持全文索引 innoDB 插入速度慢 支持事务安全 假设两人同时购买火车票,两人同时看到只有一张火车票,几乎同时下单 或 ...
- MySql cmd下的学习笔记 —— 有关视图的操作(algorithm)
建立一张简单的查询视图,不用临时表,只用条件合并 在简单的查询中,建立临时表的开销比较大 这是可以指定algorithm选项为merge 在v2的视图中,并没有建立临时表 但在下列情况下,必须建立临时 ...
- MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)
先找到goods表 查询goods_id最大的商品 where型的子查询 查询goods_id最大的商品(不能用排序) 把两步写成一步,就是子查询 from型子查询 查找出每种cat_id下goods ...
- MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, ), -> matime da ...
- MySql cmd下的学习笔记 —— 有关分组的操作(group by)
(一) 把建立的goods表找到 (二) 当cat_id = 3时,计算所有商品的库存量之和 计算每个cat_id下的库存量(group by) 需要用到分组,把每个红框内的计算在一起 筛选出本店价比 ...
- MySql cmd下的学习笔记 —— 有关select的操作(max, min等常见函数)
先把之前建的goods表找到 找到最贵的本店价(max) 找到最便宜的本店价(min) 查出一共还有多少商品(count) 查看商品价的平均价(avg) 查看本店有多少种商品 当count(*)时 输 ...
- MySql cmd下的学习笔记 —— 有关建立表的操作(有关于数据类型)
(01)建表的过程实际上是 声明字段 的过程 一. 列类型(字段): 存储同样的数据时,不同的列类型,所占据的空间和效率是不一样的,这就是建表时要考虑的意义. 二.MySQL三大列类型 数值型 ...
- MySql cmd下的学习笔记 —— 有关表的操作(对表中数据的增,删,改,查)
(知识回顾) 连接数据库 mysql -uroot -p111 先建立一个新库 create database test1; use test1; 由于今天的主要内容是表的操作,建立表的详细过程不是本 ...
随机推荐
- Luogu P2468 [SDOI2010]粟粟的书架
一道二合一的题目.两部分思维难度都不太高,但是也都很巧妙.尤其是主席树的\(50\)分,由于本人初学主席树,所以没有见过主席树上二分的套路,就被小小的卡了一下.. \(n <= 200\) \( ...
- qml: 打包 和 发布
Qt 提供了打包工具windeployqt, 利用该工具可以很方便的解决qt的依赖问题(注:通过实际验证,发现该工具只能解决大部分的依赖问题,不知道是不是本人 没有正确的使用的问题). qt源码编译r ...
- Java封装、继承整理
封装 3.1封装概念: 提高代码复用性 隐藏实现细节,对外访问提供公共接口 提高安全型 3.2封装举例 机箱就是隐藏实现细节,提供了公共的访问接口 3.3私有private 一般对成员属性的访问动作: ...
- Storm 消息分发策略
1.Shuffle Grouping:随机分组,随机派发stream里面的tuple,保证每个bolt接收到的tuple数目相同.2.Fields Grouping:按字段分组,比如按userid来分 ...
- sklearn-标准化标签LabelEncoder
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- CSS常用选择器的认识
---恢复内容开始--- 前言:在CSS中选择器的种类有很多很多,但是在实际的工作中,我们经常会用到的分为两大类:基础选择器和复合选择器这两个大类,学习选择器的目的就是为了在复杂的页面中能够快速定位到 ...
- java NIO入门【原】
server package com.server; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import jav ...
- ACM-ICPC 2018 焦作赛区网络预赛 J Participate in E-sports(大数开方)
https://nanti.jisuanke.com/t/31719 题意 让你分别判断n或(n-1)*n/2是否是完全平方数 分析 二分高精度开根裸题呀.经典题:bzoj1213 用java套个板子 ...
- HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)
http://acm.hdu.edu.cn/showproblem.php?pid=6315 题意 a数组初始全为0,b数组为1-n的一个排列.q次操作,一种操作add给a[l...r]加1,另一种操 ...
- HDU 1052(田忌赛马 贪心)
题意是田忌赛马的背景,双方各有n匹马,下面两行分别是田忌和齐王每匹马的速度,要求输出田忌最大的净胜场数*每场的赌金200. 开始的时候想对双方的马匹速度排序,然后比较最快的马,能胜则胜,否则用最慢的马 ...