学习内容:

1.触发器:

什么是触发器?我们什么时候能够使用触发器?

  触发器就是用来监听某个表的变化,当这个表发生变化的时候来触发某种操作..比若说两个表是相互关联的,当我们在对其中一个表格进行操作的同时,另一个表内的数据也需要进行某种操作,那么我们就需要建立一个触发器来监听任何一个表发生的变化,当其中一个表的数据发生变化的同时,触发器里的代码块将会对另一个表格进行对数据的某种操作。。

总而言之,触发器一般是使用在表与表之间的,单个的表建立触发器是没有任何的意义的。。。。

触发器的监听范围:增,删,改

触发的操作:增,删,改

  有点懵,我们来举一个实例。。。比如说一个订餐系统。。其中存在着一个订单数量的数据库,一个外卖样式的数据库。。当客户进行订餐的时候,订单的数量变化的同时,那么外卖样式的数据库信息也要发生变化,这两个表是相互关联的。。总不能我们的库存外卖数量已经空了,我们还能够接受订单吧?一旦出现这种情况,那么必定会出现问题。。。因此我们可以使用触发器来解决这个问题。。。

create table order_form
(
order_form_id int not null, //每一种外卖的id
order_form_much int not null //每一种外卖允许订的最大数量
); //建立一个订单表格.....
create table food
(
food_id int not null, //外卖的id信息
food_name nvarchar(50) not null, //外卖的名字,样式
food_much int not null //外卖的库存量
); insert into order_form values(1,10),(2,5),(3,15),(4,20),(5,5); //插入数据信息 insert into food values(1,'澳洲鲍鱼',10),(2,'龙虾',5),(3,'鱼翅',15),(4,'花枝',20),(5,'干贝',5); //插入信息 比如说用户订了一份澳洲鲍鱼,那么food内名字为澳洲鲍鱼的库存数量就需要减一,同时订单内名字为澳洲鲍鱼的数量也需要减一。。。当最大数量减为0的时候,那么就代表库存空了,那么就不再接受客户的订单了.... 这个过程的实现需要触发器。。。基本语法:
create trigger trigger_name (after/before insert/update/delete 监听的范围) on table_name for each row
begin
一句或者多句sql语句;
end; create trigger trg1 after on order_form for each row
begin
update food set food_much=food_much-1 where food_id=old.order_form_id; //这个old必须要加,否则出错....
end; update order_form set order_form_much=order_form_much-1 where order_form_id=1; //当这句话执行的时候触发器将被触发。。意思就是客户定了一份外卖,那么订单数在减一的同时,库存量同时也要减少.... 这个触发器不灵活,因为客户不可能每次都定一份外卖吧。。有可能订多份。。。我们是可以对订的数量进行判断,但是如果订了1000份,我们总不能判断1000次吧。。。因此我们还可以新建一个表格,里面保存着每一份外卖被订了多少次。。然后通过对这个表保存的信息来修改其他两个表信息.... create table c_count
(
id int not null,
num int not null default 0,
primary key(id);
);
当有订单的时候,我们把订单的数据更新到这个表格内。。 建立触发器。。。
create trigger trg2 after on update on for each row
begin
update food set food_much=food_much-old.num where food_id=old.id;
update food set order_form_much=order_form_much-old.num where order_form_id=old.id;
end; update c_count set num=2 where id=3;//触发器被触发。。。

  上面只是简单的介绍了一下更新操作,我再简单的说一下插入和删除操作是如何触发监听的,虽然说模式都差不多,但是还是有一些需要注意的地方...

删除操作后的触发:

比如说当用户取消订单的时候,那么我们对应的允许的订单数量和库存量也要随之发生改变。。。

create table c_count
(
id int not null,
num int not null default 0,
primary key(id);
); //还是那个表格。。。 create trigger trg2 after on update on for each row
begin
update food set food_much=food_much+old.num where food_id=old.id;
update food set order_form_much=order_form_much+old.num where order_form_id=old.id; //也是使用(old.数据) 来表示删除前的数据信息
end; delete from c_count where id=1;

插入操作的触发:

比如说:店内新增了一样产品。。。那么我们仍然需要更新数据库内的信息...

mysql> create trigger trg1 after insert on c_count for each row
-> begin
-> insert into food values(6,'比目鱼',8);
-> insert into order_form values(6,8);
-> end; mysql> insert into c_count values(6,8); //这里还有一个注意。。就是像上面删除的地方我们需要使用(old.数据)来操作我们删除之前的数据。。。那么这里的插入操作,我们需要使用(new.数据)来操作我们插入的新数据...

删除触发器:

drop trigger trg1;

查看触发器信息:

show triggers;

触发器里after和before的区别:
after是先安完成数据的增,删,改再触发
触发的语句晚于监视的增,删,改,无法影响前面的增删改动作
before是先完成触发,再增删改
触发的语句先于监视的增删改发生,我们有机会判断,修改即将发生的操作

Mysql学习笔记(十二)触发器的更多相关文章

  1. MySQL学习笔记十二:数据备份与恢复

    数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...

  2. MySQL学习笔记(十二)__连接查询(一)

    连接查询含义:又称多表查询,当查询的字段来自多个表时,就会用到连接查询 笛卡尔乘积现象:表1 有 m 行,表2 有 n 行,结果 = m*n 行发生原因:没有有效的连接条件如何避免:添加有效的连接条件 ...

  3. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  4. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  5. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  6. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  7. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  8. Python学习笔记(十二)—Python3中pip包管理工具的安装【转】

    本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  9. MYSQL进阶学习笔记十二:MySQL 表分区!(视频序号:进阶_29,30)

    知识点十三:MySQL 表的分区(29) 一.什么要采用分区: 分区的定义: 当数据量过大的时候(通常是指百万级或千万级数据的时候),这时候需要将一张表划分几张表存储.一些查询可以得到极大的优化,这主 ...

  10. Mysql学习笔记(二)对表结构的增删改查

    有将近一个星期都没有更新mysql了.相反linux的东西倒是学习不少.可能我个人情感上对linux更感兴趣一点.但mysql我也不烦,只是一旦将精力投入到了一样事情上去,就很难将精力分散去搞其他的东 ...

随机推荐

  1. Android开发的技术层次

    任何一种移动开发生态系统其技术人员都是呈现金字塔式分布的.我借此也说说Developer和Programmer的区别: Programmer是真正意义上的程序员,写程序的.灵魂级 Developer是 ...

  2. 斐波那契数列(Fibonacci)递归和非递归实现

    序列前9项为:0, 1, 1, 2, 3, 5, 8, 13, 21 要注意非递归的话就是那一个变量帮助存储当前下一项的值,然后依次挪动两个指针往下即可 注意如果n太大 会溢出             ...

  3. 学习rabbitmq

    http://www.cnblogs.com/dubing/p/4017613.html elk+redis 搭建nginx日志分析平台 http://www.cnblogs.com/yjf512/p ...

  4. 高级屏幕空间反射: Screen Space Reflection (SSSR)

    SSSR进一步调优,对标寒霜级技术水平,实现方式为Direct3D 11+自主实现实时渲染引擎,方法为对比测试.实现已经有段时间了,还是简要更新下吧.以下画面中的SSSR效果全部采用1:4 resol ...

  5. SVO实时全局光照优化(里程碑MK0):Sparse Voxel Octree based Global Illumination (SVO GI)

    完全自主实现,bloat-free.再次声明,这不是UE.U3D.CE.KlayGE! 老规矩,先贴图.后面有时间再补充描述. 1. 支持多跳间接全局光照2. 支持vxao/so.vxdiff/spe ...

  6. Android使用的设计模式2——策略模式

    今天讲解一下策略模式,策略模式也是很常用的设计模式,对多种算法或者数据结构选择使用的情况下,经常会使用策略模式来管理这些算法.下面会简单讲解一下策略模式的概念和基本实现.然后结合Android里面的实 ...

  7. 常用的sql脚本 游标遍历操作

    Declare @id int DECLARE cursor_data CURSOR FOR --这里是取得数据源 OPEN cursor_data FETCH FROM cursor_data IN ...

  8. python字符串格式化方法 format函数的使用

      python从2.6开始支持format,新的更加容易读懂的字符串格式化方法, 从原来的% 模式变成新的可读性更强的 花括号声明{}.用于渲染前的参数引用声明, 花括号里可以用数字代表引用参数的序 ...

  9. 判断big endian和little endian的方法

    http://blog.sina.com.cn/s/blog_6ab0b9a80101awzr.html   不同体系的CPU在内存中的数据存储往往存在着差异.例如,Intel的x86系列处理器将低序 ...

  10. INSTALL MYSQL IN MAC

    安装好MYSQL后,在System References中找到MYSQL,启动它. 启动之后在终端中输入添加MySQL路径的命令,把MYSQL路径添加到PATH中: PATH="$PATH& ...