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笔记---视图,存储过程, 触发器的使用入门
大二学数据库的时候,只是隐约听到老师提起过视图啊,存储过程啊,触发器啊什么的,但只是淡淡的记住了名字,后来自己做些小项目,小程序,也没有用上过,都只是简单的建表,关联表之类的,导致我对这些东西的理解只 ...
随机推荐
- CS academy Growing Trees【模板】DP求树的直径
[题意概述] 给出一棵树,树上的边有两个值a和b,你可以在[0,limit]范围内选择一个整数delta,树上的边的权值为a+b*delta,现在问当delta为多少的时候树的直径最小.最小直径是多少 ...
- LeetCode02-两数相加
''' 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示 ...
- Ubuntu16.04 搭建svn
1.安装SVN 安装前先更新一下 sudo apt-get update 接下来安装 sudo apt-get install subversion 2.创建SVN版本库 1.创建home下的svn文 ...
- MindManager 设置默认Note字体大小
工具栏 Design > Notes Theme > Default Font
- Leetcode 312.戳气球
戳气球 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left] * n ...
- 洛谷 P2008 大朋友的数字
DP,动态规划 树状数组 最长不下降子序列 by GeneralLiu 题目 就是说给一串由 0~9 组成的序列 求 以 i (1~n) 结尾 的 最长不下降子序列 的 和 (最长不下降子序 ...
- C 题 KMP中next[]问题
题目大意: 找到能够进行字符串匹配的前缀 这题只要一直求next,直到next为0停止,记得答案是总长减去next的长度 #include <iostream> #include < ...
- Cloud BOS平台-自定义用户联系对象
适用业务场景:新增用户时,联系对象类型默认为:职员.客户.供应商.客户需要增加一类"承运商",类型选择"承运商"时,联系对象只显示相应的承运商."承运 ...
- 【HDOJ6301】Distinct Values(贪心,set)
题意:给定一个n个数的数列与m个区间,要求每个区间内的数字互不相同,求使得数列字典序最小的方案 n<=1e5 思路: #include<cstdio> #include<vec ...
- eslint (js代码检查)
eslint 是一个应用广泛的javascript代码检查工具. 能检测变量名重复等等... 1.安装 npm install -g eslint 2.初始化 会在当前目录下生成一个.eslintrc ...