Mysql学习笔记(十二)触发器

学习内容:

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是先完成触发,再增删改
触发的语句先于监视的增删改发生,我们有机会判断,修改即将发生的操作

时间: 2024-10-05 04:45:12

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

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

数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql服务器,或者对需要备份的对象进行锁定,要不很容易造成备份的不一致性,恢复时可能会丢失数据.物理备份的方式有很多,如操作系统命令copy(cp),scp,mysqlbackup,以及MyISAM表的mysqlhotcopy. 逻辑备份 逻辑备份是对数据库的逻辑结构(create database,cr

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

虚拟机VMWare学习笔记十二 - 将物理机抓取成虚拟机

1. 安装VMware vCenter Converter Standalone Client 运行虚拟机,File -- Virtualize a Physical Machine 这时如果电脑中没有VMware vCenter Converter Standalone Client ,则会进行安装. 安装过程 之后图标会出现在桌面上,双击运行 选择连接到本地服务器,登陆 点击转换计算机 这个,可以将本地计算机抓取成虚拟机,也可以将其他可以访问的计算机(需知道管理员用户名及密码)抓取成虚拟机.

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

原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与varchar char与varchar的类型相似,但是他们的保存方式和检索方式不同... char的存储结构是固定长度的存储...即指定了几个字节,那么就占用几个字节,如char(4),那么无论存入的是什么字串,那么都占用四个字节...char的 可表示长度范围为0-255的任何值,当保存的字节不

Mysql学习之十二:JDBC连接数据库之DriverManager方法

JDBC连接数据库 ?创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ Sy

《Hibernate学习笔记十二》学生、课程、分数关系的设计与实现

<Hibernate学习笔记十二>学生.课程.分数关系的设计与实现 这个马士兵老师的Hibernate视频学习的一个题目,这里面要用到多对多.多对一的关联关系以及联合主键,因此觉得挺好的,自己写篇博文来记录下. 先考虑数据库表 1.学生表:为简单起见,只考虑了学生id和学生姓名,其中id为主键 2.课程表:为简单起见,只考虑了课程id和课程名称,其中id为主键 3.分数表 分数表有两种解决方案 3.1 第一种为:使用联合主键:student_id 和 course_id 3.2 第二种:不使用

laravel3学习笔记(十二)

原作者博客:ieqi.net ==================================================================================================== 请求反射 HTTP 协议本身是无状态性的,但是在应用中处理各种业务逻辑时我们必须要有状态的把控,这样,折中的办法就是将状态进行标记然后嵌入到 HTTP 协议的请求中,然后应用根据这些标记来进行状态的串联以及处理.所以我们就要对请求进行反射处理以获取请求信息, Lara

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

欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们会简单的描述一下jvm访问控制器的栈校验机制. 这节课,我们还是以实践为主,什么是栈校验机制,讲一百遍不如你自己实际的代码一下然后验证一下,下面我们下把环境搭起来. 第一步,配置系统环境.(copy吧,少年) path=%JAVA_HOME%/bin JAVA_HOME=C:/Java/jdk1.6

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

有将近一个星期都没有更新mysql了.相反linux的东西倒是学习不少.可能我个人情感上对linux更感兴趣一点.但mysql我也不烦,只是一旦将精力投入到了一样事情上去,就很难将精力分散去搞其他的东西. 最近我也调整了学习计划和健身计划.以前是每天晚上下班后,运动半个小时到一个小时,现在是晚上早睡,基本上如果没有特别的安排,10:30是肯定要入睡的.从下班到家,然后抽出二到三个小时学习一下.至于健身,要放在了早上,昨天试验了一下,早上还是起的来的.5:30起床,跑步半个小时,甚至还有时间去早市

mysql学习笔记(二)--- MySQL数据类型

[正文] 上一章节中,我们学习了MySQL软件的安装,既然软件都装好了,现在就正式开始MySQL的基础知识的学习吧,即使是零基础,也要一步一个脚印.恩,首先要学习的就是MySQL的数据类型. 一.数据类型: 1.整型(xxxint) 2.浮点型(float和double) 3.定点数(decimal) 4.字符串(char,varchar,xxxtext) 5.二进制数据(xxxBlob) 6.日期时间类型 二.数据类型介绍: 1.整型: 注:M表示最大的显示宽度.其中,int用的最多. 2.浮