触发器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---触发器的更多相关文章

  1. pt-online-schema-change中update触发器的bug

    pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ...

  2. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  3. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  4. MSSQL 事务,视图,索引,存储过程,触发器

    事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据 ...

  5. Mysql - 触发器/视图

    触发器在之前的项目中, 应用的着实不多, 没有办法的时候, 才会去用这个. 因为这个东西在后期并不怎么好维护, 也容易造成紊乱. 我最近的项目中, 由于数据库设计(别人设计的)原因, 导致一些最简单功 ...

  6. Oracle使用触发器和mysql中使用触发器的比较——学习笔记

    一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...

  7. 我的MYSQL学习心得(十二) 触发器

    我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...

  8. Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等

    功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...

  9. MySQL触发器-条件触发器语法

    文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 实验4 触发器 )实验目的 掌握数据库触发器的设计和使用方法 )实验内容和要求 定义BEFORE触发 ...

  10. MySQL笔记---视图,存储过程, 触发器的使用入门

    大二学数据库的时候,只是隐约听到老师提起过视图啊,存储过程啊,触发器啊什么的,但只是淡淡的记住了名字,后来自己做些小项目,小程序,也没有用上过,都只是简单的建表,关联表之类的,导致我对这些东西的理解只 ...

随机推荐

  1. LeetCode(59)Length of Last Word

    题目 Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return th ...

  2. 线性结构4 Pop Sequence

    02-线性结构4 Pop Sequence(25 分) Given a stack which can keep M numbers at most. Push N numbers in the or ...

  3. winfor应用程序打印报表清单

    最近一周竟然有2位以前的同事问我在winfor应用程序里面打印怎么搞,所以才有了写这篇文章的打算,索性现在没事就写出来 在窗体上简单的布局设置一下如图 定义一个Model 我在里面放了属性之外还从写了 ...

  4. [luoguP1119] 灾后重建(Floyd)

    传送门 基于Floyd的动态规划原理,我们可以只用进行一次Floyd. 而题目给出的限制条件相当于给Floyd加了时间限制而已. 还是得靠对Floyd的理解. ——代码 #include <cs ...

  5. hdu4135 Co-prime【容斥原理】

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. 《TCP/IP详解卷1:协议》——第1章:概述(转载)

    1.引言 很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但TCP/IP协议族允许它们互相进行通信.TCP/IP起源于60年代末美国政府资助的一个分组交换网络研究项目,到90年代已发展 ...

  7. mongodb 报错问题

    系统不支持:Mongo 错误位置 FILE: C:\wamp64\www\frame\a_tp32\ThinkPHP\Library\Think\Db\Driver\Mongo.class.php L ...

  8. 原生js中stopPropagation,preventDefault,return false的区别

    1.stopPropagation:阻止事件的冒泡,但不阻止事件的默认行为. 最好莫过于用例子说明: <div id='div'  onclick='alert("div") ...

  9. java学习(4)——动手动脑

    根据ppt所给的例子,运行的结果如下所示: ppt中出现的第二个动手动脑如下: 代码如下: 其运行结果如下: 作出简单的分析如下:有点类似于if 和else的关系,总是对应try和catch同层中的异 ...

  10. ArcEngine影像图配准

    转自原文ArcEngine影像图配准 影像图配准主要包括以下几个方面 1.打开影像图 2.配准 3.影像图入库/保存 1.打开影像图的代码以前已经写过了. 2.配准   配准 主要使用IGeoRefe ...