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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 原文:Mysql学习笔记(十二)触发器学习内容: 1.触发器: 什么是触发器?我们什么时候能够使用触发器?   触发器就是用来监听某个表的变化,当这个表发生变化的时候来触发某种操作..比若说两个表是相互关联的,当我们在对其中一个表格进行操作的同时,另一个表内的数据也需要进行某种操作,那么我们就需要建立一个触发器来监听任何一个表发生的变化,当其中一个表的数据发生变化的同时,触发器里的代码块将会对另一个表格进行对数据的某种操作。
原文: 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是先完成触发,再增删改
触发的语句先于监视的增删改发生,我们有机会判断,修改即将发生的操作

 

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
216
分享
相关文章
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
315 80
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
228 6
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
158 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
126 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
105 1
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
112 0
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等