MySQL之触发器和存储过程

1、触发器

触发器简介

  触发器(trigger)是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触 发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。 触发器经常用于加强数据的完整性约束和业务规则等。

  例如,当学生表中增加了一个学生的信息时,学生的总数就应该同时改变。因此可以针对学生表创建一个 触发器,每次增加一个学生记录时,就执行一次学生总数的计算操作,从而保证学生总数与记录数的一致性。

2、存储过程 

  存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,调用存储过程可以简化应用开发人 员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 简单的说,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语 言中的方法,是SQL 语言层面的代码封装与重用。 存储过程和函数的区别: 函数必须有返回值,而存储过程没有。 存储过程的参数可以是IN、OUT、INOUT类型,函数的参数只能是IN

优点:

存储过程只在创建时进行编译;而SQL语句每执行一次就编译一次,所以使用存储过程可以提高数据库执行

速度 简化复杂操作

结合事务一起封装 复用性好 安全性高

可指定存储过程的使用权

注意:并发量少的情况下很少使用存储过程,并发量高的情况下,为了提高效率,用存储过程比较多。

 使用触发器和存储过程的实例

触发器

 # 建立两个表:goods(商品表)、orders(订单表)

use mydb16_trigger;

# 建立goods表

create table goods (gid char(8) primary key,name varchar(10),price decimal(8,2),num int);

# 建立orders表

create table orders(

oid int primary key auto_increment,

gid char(10)not null,
name varchar(10),
price decimal(8,2),
onum int,

otime date

);

向商品表导入数据

insert into goods values(('A0001','橡皮',2.5,100)
('B0001','小楷本',2.8,210),
('C0001','铅笔',1.2,120)
('D0001','计算器”28,20);

建立触发器,订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量,并测试

# 建立触发器

mysql> create trigger orders_after_insert_trigger
    -> after insert on orders for each row
    -> update goods set num=num-new.onum
    -> where gid=new.gid;

# 测试

向orders表中加入数据

insert into orders(gid,name,price,onum,otime) value('C0001','铅笔',1.2,80,now());

goods表中的数据会发生改变

select * from goods;

插入数据前:

插入数据后:

 建立触发器,实现功能:客户取消订单,恢复商品表对应商品的数量

mysql> create trigger orders_after_delete_trigger
    -> after delete on orders for each row
    -> update goods set num=num+old.onum
    -> where gid=old.gid;

建立触发器,实现功能:客户修改订单,商品表对应商品数量同步更新

mysql> create trigger orders_after_update_trigger
    -> after update on orders for each row
    -> update goods set num=num+(old.onum-new.onum)
    -> where gid=old.gid; 

存储过程 

使用mydb7 openlab库

mysql> use mydb7_openlab

创建提取emp_new表所有员工姓名和工资的存储过程s1

mysql> delimiter //
mysql> create procedure s1()
    -> begin
    ->          select name,incoming from emp_new;
    -> end // 

# 测试

mysql> delimiter ;
mysql> call s1();

创建存储过程s2,实现输入员工姓名后返回员工的年龄 

mysql> delimiter $$

mysql> create procedure s2(in in_name varchar(11),out out_age int)
    -> begin
    ->          select age into out_age from emp_new where name=in_name;
    -> end $$

mysql> delimiter ;

mysql> call s2('张三',@age);

mysql> select @age;

创建一个存储过程s3,有2个参数,传入部门号,返回该部门的平均工资

 mysql> delimiter //

mysql> create procedure s3(in in_dept int, out avg_sal float)
    -> begin
    ->          select avg(incoming) into avg_sal from emp_new where dept2=in_dept;
    -> end //

mysql> delimiter ;
mysql> call s3(101,@sal);

mysql> select @sal;

 

本次实验就顺利完成了,触发器和存储过程的应用相信大家跟着实例做很会快掌握,大家一起加油努力,我们下期见!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3267649.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

js返回一个月的所有天数,用数组表示

直接上代码 import dayjs from dayjs import isSameOrBefore from dayjs/plugin/isSameOrBefore dayjs.extend(isSameOrBefore)function getCurrentMonthDays(month) {const firstDay dayjs().startOf(month);const lastDay dayjs().endOf(month);const allDatesInMonth []…

【C++笔试强训】day05

游游的you 思路 贪心:优先组成 you,最少的字母决定了you的数量。需要注意:如果oo剩下n个,那么相邻oo的个数是n-1个,而不是n/2个。 例如 oooooo oo oo oooo oo 6个o,两两组合有3对,掐头去尾有…

【支持语言模型和视觉语言模型的推理引擎sglang】

介绍 sglang是一个AI推理引擎,是一个专门为大语言模型和视觉语言模型设计的高效服务框架。 就像F1赛车需要顶级发动机一样,大语言模型也需要高效的推理引擎来发挥潜力。 而sglang正是这样一个性能怪兽。 根据LMSys组织的官方公告,最新的s…

CCS(Code Composer Studio 10.4.0)编译软件中文乱码怎么解决

如果是所有文件都出现了中文乱码这时建议直接在窗口首选项中修改:选择"Window" -> "Preferences",找到"General" -> "Workspace",将"Text file encoding"选项设置为"Other&quo…

Mac printf处理参数的奇特之处(macOS中,printf使用%d输出一个浮点数会发生什么情况?)

今天早上网上冲浪的时候看到了 2016 年的一篇文章&#xff0c;里面提到了一段代码&#xff1a; #include <stdio.h> int main() {double a 10;printf("a %d\n", a);return 0; }说这段代码在 x86&#xff08;IA-32&#xff09;上运行时&#xff0c;输出为0&a…

Java语言程序设计——篇八(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; Java常用核心类 主要内容Object: 终极父类toString( )方法equals( )方法getClass( )方法hashCode( )方法clone( )方法finalize( )方法实战演练 …

c语言之给三个数字排大小

写代码将三个整数数按从大到小输出。 例如&#xff1a; 输入&#xff1a;2 3 1 输出&#xff1a;3 2 1 首先三个整数从大到小排&#xff0c;先创建三个变量 输入数字大小 通过冒泡排序派大小最后在输出出来。 简单介绍一下冒泡排序&#xff0c;后期在完整的写出来 冒泡排…

文件上传总结

一、原理 通过界面上的上传功能上传了一个可执行的脚本文件&#xff0c;而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好&#xff0c;使得恶意用户可以通过文件中上传的一句话木马获得操控权 二、绕过方法 1>前端绕过 1.删除前端校验函数 checkFile() 2.禁用js…

华为Ascend C算子开发(中级)考试

华为Ascend C算子开发&#xff08;中级&#xff09;考试题 提示&#xff1a;这个是河北廊坊Ascend C算子开发考试题和答案&#xff0c;仅供参考&#xff0c;因为不确定其他城市的考试题是否也是一样 文章目录 华为Ascend C算子开发&#xff08;中级&#xff09;考试题一、op_ho…

捉虫笔记(1)之 WinDbg符号配置

WinDbg符号配置 1、WinDbg简单介绍 WinDbg 是微软的一款强大的调试工具&#xff0c;用于 Windows 平台的内核和用户模式调试。它提供了一系列强大的功能&#xff0c;包括内存和寄存器的查看、断点设置、堆栈跟踪、性能分析等。 WinDbg 的历史可以追溯到微软早期的调试工具&a…

最新风车IM即时聊天源码及完整视频教程2024年7月版

堡塔面板 试验性Centos/Ubuntu/Debian安装命令 独立运行环境&#xff08;py3.7&#xff09; 可能存在少量兼容性问题 不断优化中 curl -sSO http://io.bt.sy/install/install_panel.sh && bash install_panel.sh 1.宝塔环境如下: Nginx 1.20 Tomcat 8 MySQL 8.0 R…

从0到1搭建一个组件库

最近我开启了一个新项目&#xff0c;基于echarts进行二次封装&#xff0c;希望能为Vue3项目量身打造一套高效、易用的图表组件库&#xff0c;取名为 v-echarts。 目前雏形已经搭建完成&#xff0c;先把整个搭建过程做一个记录。后续再持续迭代、完善该图表组件库。 v-echarts 文…

RustDesk远程控屏软件使用教学

RustDesk自建服务器使用教学RustDesk远程控屏软件使用教学 下载软件后 右键管理员运行 点击右上角设置按钮 管理员运行 保证启动服务 点击左侧导航栏网络按钮 复制域名或者ip地址到 ID服务器 输入框 然后点击应用即可

移动式气象站:科技赋能,精准预报的新篇章

在这个气候多变、极端天气频发的时代&#xff0c;气象信息的准确性与及时性成为了社会各界关注的焦点。从农业生产到城市规划&#xff0c;从航空航海到日常生活&#xff0c;气象服务无处不在&#xff0c;其重要性不言而喻。而在这场气象科技的变革中&#xff0c;移动式气象站以…

友思特应用 | 硅片上的光影贴合:UV-LED曝光系统在晶圆边缘曝光中的高效应用

导读 晶圆边缘曝光是帮助减少晶圆涂布过程中多余的光刻胶对电子器件影响的重要步骤。友思特 ALE/1 和 ALE/3 UV-LED 高性能点光源&#xff0c;作为唯一可用于宽带晶圆边缘曝光的 i、h 和 g 线的 LED 解决方案&#xff0c;可高效实现WEE系统设计和曝光需求。 晶圆边缘曝光及处…

The Llama 3 Herd of Models.Llama 3 模型论文全文

现代人工智能(AI)系统是由基础模型驱动的。本文提出了一套新的基础模型,称为Llama 3。它是一组语言模型,支持多语言、编码、推理和工具使用。我们最大的模型是一个密集的Transformer,具有405B个参数和多达128K个tokens的上下文窗口。本文对Llama 3进行了广泛的实证评价。我们…

day06 1.算法的相关概念2.排序算法3.查找算法

一、算法的相关概念 程序 数据结构 算法 算法是程序设计的灵魂&#xff0c;结构是程序设计的肉体 算法&#xff1a;计算机解决问题的方法或步骤 1.1 算法的特性 1> 确定性&#xff1a;算法中每一条语句都有确定的含义&#xff0c;不能模棱两可 2> 有穷性&#xff1a;…

【Linux】从零开始认识多线程 --- 线程ID

在这个浮躁的时代 只有自律的人才能脱颖而出 -- 《觉醒年代》 1 前言 上一篇文章中讲解了线程控制的基本接口&#xff1a; 线程创建pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);: pthread_t *thread :输出…

使用API有效率地管理Dynadot域名,设置过期域名抢注请求

简介 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

深入理解SQL中的INNER JOIN操作

本文介绍了INNER JOIN的定义、使用场景、计算方法及与其他JOIN的比较。INNER JOIN是关系数据库中常用的操作&#xff0c;用于返回两个表中匹配的行&#xff0c;只有在连接条件满足时才返回数据。本文详细解释了INNER JOIN的语法及其在一对多、多对多关系中的应用&#xff0c;通…