mysql03---触发器
触发器trigger:某条数据改变,希望其他数据也改变(一张表的数据改变,另一张表的数据也变)。监测insert,update,delete.能够监测增删改并出发增删改。
监测点(table)监测事件(insert,update,delete)触发时间(after,before)触发事件(insert,update,delete).
当下一个订单的时候,对应的商品库存减少。监视table order,监视动作insert,触发时间after,触发事件update create trigger t1//触发器名字
after//之后触发
insert//监测插入操作
on order//监测order表
for each row
begin//触发执行的n条语句
update goods set num=num-2 where gid=1;
update goods set...
end create table goods(//创建商品表
gid int,
name varchar(20),
num smallint//库存
); create table order(//创建订单表
oid int,
gid int,//哪个商品的订单
much smallint//买了几个商品
); insert into goods values (1,'猫',34),(2,'马',65),(3,'猪',21);
insert into orde values (1,1,2); delimiter $ //begin end中间有语句后面有分号,语句最后也有分号,所以区分不了,这里告诉mysql以$符号作为最后结束符。
create trigger t1
after
insert
on orde
for each row
begin
update goods set num=num-2 where gid=1;
end$ //现在结束符已经是$了,要手动修改过来,delimiter ; mysql> show triggers;
+---------+--------------------+
| Trigger | Event | Table | Statement | Timing | Created | sql_mode | character_set_client | collation_connection | Database Collation |
+---------+--------------------+
| t1 | INSERT | orde | begin
update goods set num=num-2 where gid=1;
end | AFTER | 2017-12-27 21:47:13.47 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | skip-grants user@skip-grants host | utf8 | utf8_general_ci | utf8_general_ci |
+---------+--------+-------+-----+
1 row in set mysql> insert into orde values (3,3,3);//然后goods表就更新了。 mysql> truncate orde$ //清空表
mysql> drop trigger t1$ //删除触发器 //插入订单触发器,添加的叫做new
mysql> delimiter $
create trigger t2
after
insert
on orde
for each row
begin
update goods set num=num-new.num where gid=new.gid;//new是插入orde的那个新行
end$ mysql> insert into orde values (1,3,21)$ //goods表就自动更新了 //删除订单触发器, 被删除的叫old
mysql> delimiter $
create trigger t3
after
delete
on orde
for each row
begin
update goods set num=num-old.num where gid=old.gid;//old是删除orde的那个新行
end$ mysql> delete from orde where gid=1$ //goods表就自动更新了 //改订单触发器,改之前叫做old改之后叫做new
mysql> delimiter $
create trigger t4
before
update on orde
for each row
begin
update goods set num=new.num + old.num where gid=old.gid;//old是删除orde的那个新行
end$ mysql> update orde set num=5 where gid=1$ //如果库存只有3头猪,客户要买10头猪,能否在much>num时候,把much改为num,
mysql> delimiter $
create trigger t5
before //不能用after,
insert
on orde for each row
begin declare
rnum int;//声明变量rnum为int型,为订单的数量,也就是要删除的数量, select num into rnum from goods where gid=new.gid;//new.gid要插入订单的新行,num是库存量,
if rnum < new.num then
set new.num=1;
end if; update goods set num=num-new.num where gid=new.gid;//new是插入orde的那个新行
end$ mysql> insert into orde values(1,2,77)$ //for each row:触发器分为语句级触发器,行级触发器,
比如
create trigger tn
after update
on xxtable
for each row
begin
sql...
end$ 执行:update xxtable set xxx=xxx where id>100;//修改了100行
那么sql会被触发100次。 mysql> create trigger t6
after
update
on orde
for each row //每一行受影响,触发器都执行,
begin
insert into ceshi values (1);
end$ mysql> update orde set num=10 where gid=3$ //插入了4次 //oracle中for each row 不写,无论影响了多少行,都只执行一次,
//比如,有人下一个订单,买了5件商品,可以用行触发器insert5次商品,用语句触发器,insert1条发货提醒。然而mysql不支持语句级触发器,所以for each row不能省略。oracle可以不写for each row成为语句级触发器。
mysql03---触发器的更多相关文章
- pt-online-schema-change中update触发器的bug
pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- MSSQL 事务,视图,索引,存储过程,触发器
事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据 ...
- Mysql - 触发器/视图
触发器在之前的项目中, 应用的着实不多, 没有办法的时候, 才会去用这个. 因为这个东西在后期并不怎么好维护, 也容易造成紊乱. 我最近的项目中, 由于数据库设计(别人设计的)原因, 导致一些最简单功 ...
- Oracle使用触发器和mysql中使用触发器的比较——学习笔记
一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...
- 我的MYSQL学习心得(十二) 触发器
我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...
- Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等
功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...
- MySQL触发器-条件触发器语法
文章为作者原创,未经许可,禁止转载. -Sun Yat-sen University 冯兴伟 实验4 触发器 )实验目的 掌握数据库触发器的设计和使用方法 )实验内容和要求 定义BEFORE触发 ...
- MySQL笔记---视图,存储过程, 触发器的使用入门
大二学数据库的时候,只是隐约听到老师提起过视图啊,存储过程啊,触发器啊什么的,但只是淡淡的记住了名字,后来自己做些小项目,小程序,也没有用上过,都只是简单的建表,关联表之类的,导致我对这些东西的理解只 ...
随机推荐
- Tomcat启动慢(运行shutdown.sh的时候报错)
Using CATALINA_BASE: /usr/local/tomcatUsing CATALINA_HOME: /usr/local/tomcatUsing CATALINA_TMPDIR: / ...
- 算法导论 第六章 2 优先队列(python)
优先队列: 物理结构: 顺序表(典型的是数组){python用到list} 逻辑结构:似完全二叉树 使用的特点是:动态的排序..排序的元素会增加,减少#和快速排序对比 快速一次排完 增 ...
- tcpcopy简单用法
这篇文章介绍下网易开源的流量重放(replay)工具TCPCopy,说是简单介绍,绝对不是谦虚,因为自己了解的确实也不多.为什么不甚了解呢,大家可以到TCPCopy的官方仓库看看,https://gi ...
- laravel(4.2) +Zizaco
操作步骤:https://github.com/Zizaco/entrust/tree/1.0 这篇博客说的蛮详细的:http://blog.boolw.com/?p=241 简化后的步骤 1.在根项 ...
- 【Codeforces 1141E】Superhero Battle
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 二分最后轮了几圈. 二分之后直接o(N)枚举具体要多少时间即可. 注意爆long long的情况. 可以用对数函数,算出来有多少个0 如果大于 ...
- python之图形界面GUI开发 Tkinter 2014-4-7
1.导入Tkinter 可以使用以下三种方法(1)from Tkinter import *#导入Tkinter(2)import TkinterTkinter.methodA使用 Tkinter.m ...
- 把以100000+4位随机码的登录账号(比如1000001234),赋予制单页面的权限,怎么写sql啊
insert into sys_user_role (user_id,role_id,office_id) select id,'000101100000000004UP',company_id f ...
- HDU 4821 字符串hash
题目大意: 希望找到连续的长为m*l的子串,使得m个l长的子串每一个都不一样,问能找到多少个这样的子串 简单的字符串hash,提前预处理出每一个长度为l的字符串的hash值 #include < ...
- [POJ1797] Heavy Transportation(最大生成树 || 最短路变形)
传送门 1.最大生成树 可以求出最大生成树,其中权值最小的边即为答案. 2.最短路 只需改变spfa里面的松弛操作就可以求出答案. ——代码 #include <queue> #inclu ...
- Bzoj 2726 SDOI 任务安排
Memory Limit: 131072KB 64bit IO Format: %lld & %llu Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务 ...