存储过程、存储函数与触发器详解(MySQL 案例)
存储过程、存储函数与触发器详解(MySQL 案例)
一、存储过程(Stored Procedure)
定义
存储过程是预先编译好并存储在数据库中的一段 SQL 代码集合,可以接收参数、执行逻辑操作(如条件判断、循环),并返回结果。它类似于编程中的函数,但专注于数据库操作。
用途
- 封装复杂业务逻辑,减少重复代码。
- 提高性能(预编译减少解析时间)。
- 减少网络流量(客户端调用一次即可执行多语句)。
- 增强数据安全性(通过权限控制访问)。
参数类型
IN
:输入参数(默认)。OUT
:输出参数,用于返回结果。INOUT
:输入输出参数。
示例
DELIMITER //
CREATE PROCEDURE AddUser(IN p_name VARCHAR(50),IN p_email VARCHAR(100),OUT p_user_id INT
)
BEGININSERT INTO users(name, email) VALUES(p_name, p_email);SET p_user_id = LAST_INSERT_ID(); -- 返回插入的ID
END //
DELIMITER ;-- 调用存储过程
CALL AddUser('Alice', 'alice@example.com', @user_id);
SELECT @user_id; -- 获取返回的用户ID
优缺点
- ✅ 复用性强,性能高。
- ❌ 调试困难,迁移成本高。
二、存储函数(Stored Function)
定义
存储函数是返回单个值的预编译 SQL 代码,必须通过 RETURN
语句返回结果,通常用于计算或转换数据。
与存储过程的区别
- 函数必须返回一个值,过程可以没有返回值。
- 函数可在 SQL 语句中直接调用(如
SELECT
),过程需用CALL
。 - 函数参数均为
IN
类型。
示例
DELIMITER //
CREATE FUNCTION GetOrderTotal(order_id INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGINDECLARE total DECIMAL(10,2);SELECT SUM(price * quantity) INTO total FROM order_items WHERE order_id = order_id;RETURN total;
END //
DELIMITER ;-- 在查询中使用函数
SELECT order_id, GetOrderTotal(order_id) AS total FROM orders;
优缺点
- ✅ 简化复杂计算,提高代码可读性。
- ❌ 不支持事务,无法修改数据库状态。
三、触发器(Trigger)
定义
触发器是自动执行的存储程序,响应特定表上的 INSERT
、UPDATE
、DELETE
事件,分为 BEFORE
(操作前)和 AFTER
(操作后)两种时机。
用途
- 数据审计(记录修改日志)。
- 强制业务规则(如字段校验)。
- 级联操作(自动更新关联表)。
示例
案例1:审计日志
CREATE TABLE audit_log (id INT AUTO_INCREMENT PRIMARY KEY,table_name VARCHAR(50),action VARCHAR(10),record_id INT,log_time TIMESTAMP
);DELIMITER //
CREATE TRIGGER AfterUserInsert
AFTER INSERT ON users
FOR EACH ROW
BEGININSERT INTO audit_log(table_name, action, record_id, log_time)VALUES ('users', 'INSERT', NEW.id, NOW());
END //
DELIMITER ;案例2:数据校验
sql
DELIMITER //
CREATE TRIGGER BeforeSalaryUpdate
BEFORE UPDATE ON employees
FOR EACH ROW
BEGINIF NEW.salary < OLD.salary THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Salary cannot decrease!';END IF;
END //
DELIMITER ;
优缺点
- ✅ 自动化数据一致性。
- ❌ 隐式执行,可能导致不可预期的副作用。
四、总结对比
特性 | 存储过程 | 存储函数 | 触发器 |
---|---|---|---|
返回值 | 可无,或通过 OUT 参数返回 | 必须返回一个值 | 无 |
调用方式 | CALL | 嵌入 SQL 语句(如 SELECT ) | 自动触发 |
参数 | 支持 IN /OUT /INOUT | 仅 IN 参数 | 无 |
应用场景 | 复杂业务逻辑 | 计算或数据转换 | 数据审计、强制规则 |
五、注意事项(MySQL)
- 使用
DELIMITER
修改分隔符以避免语法冲突。 - 触发器需谨慎设计,避免递归触发(如触发器内修改自身表)。
- 存储过程和函数需数据库
CREATE ROUTINE
权限。
通过合理使用存储过程、函数和触发器,可以显著提升数据库操作的效率和安全性。
相关文章:
存储过程、存储函数与触发器详解(MySQL 案例)
存储过程、存储函数与触发器详解(MySQL 案例) 一、存储过程(Stored Procedure) 定义 存储过程是预先编译好并存储在数据库中的一段 SQL 代码集合,可以接收参数、执行逻辑操作(如条件判断、循环)…...
2025年注册安全工程师考试练习题
注册安全工程师练习题,涵盖了不同的知识点和题型: 单选题 某机械制造企业委托具有相应资质的中介服务机构的专业技术人员为其提供安全生产管理服务。依据《安全生产法》,保证该企业安全生产的责任由( )负责。 A. 专业…...
Photoshop 2025安装包下载及Photoshop 2025详细图文安装教程
文章目录 前言一、Photoshop 2025安装包下载二、Photoshop 2025安装教程1.解压安装包2.运行程序3.修改安装路径4.设安装目录5.开始安装6.等安装完成7.关闭安装向导8.启动软件9.安装完成 前言 无论你是专业设计师,还是初涉图像处理的小白,Photoshop 2025…...
ESP32通过WiFi获取网络时间(NTP)
代码部分 代码由station_example_main的官方例程修改 /* WiFi station ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an "AS IS&…...
docker使用命令笔记
docker使用命令笔记 1. 安装docker2. 拉取镜像3. 镜像与容器4. 基于镜像创建容器4. 操作创建好的容器5. docker文件传输6. ubuntu的docker的一些基本环境搭建 记录docker的一些使用命令 1. 安装docker 遵循官方安装说明即可,windows需要下载docker desktop后在doc…...
关于服务器只能访问localhost:8111地址,局域网不能访问的问题
一、问题来源: 服务器是使用的阿里云的服务器,服务器端的8111端口没有设置任何别的限制,但是在阿里云服务器端并没有设置相应的tcp连接8111端口。 二、解决办法: 1、使用阿里云初始化好的端口;2、配置新的阿里云端口…...
触发器及报警
一、触发器介绍 Trigger 作用:报警 触发某一个监控项状态的变化 基于监控项创建 一个监控项可以有多个触发器 1、创建触发器语法 {<server>:<key>.<function>(<parameter>)}<operator><constant> {被监控主机:键值.函数…...
如何用 Postman 发送 GET 请求?详解
Postman 是一款广泛用于 API 开发和测试的工具,通过它,我们可以轻松地发送 GET 请求。首先,需要新建接口并设置为 GET 请求,然后填写相关的 URL 地址和参数,最后点击“Send”按钮即可发起请求。 Postman 如何发送 get…...
主流软件工程模型全景剖析
一、瀑布模型 阶段划分 需求分析:与用户深入沟通,全面了解软件的功能、性能、可靠性等要求,形成详细的需求规格说明书。设计阶段:包括总体设计和详细设计。总体设计确定软件的体系结构,如模块划分、模块之间的接口等&…...
NVMe协议
一、NVMe 的诞生背景 传统协议瓶颈: 早期的SATA接口SSD使用 AHCI协议,设计初衷是适配机械硬盘(HDD),其单队列、高延迟的特性无法发挥SSD的高速性能。PCIe接口的潜力: NVMe专为 PCIe接口的SSD 设…...
开关磁阻电机类型及其控制技术
开关磁阻电机( Switched Reluctance Motors,SRM) 具有结构简单、坚固、成本低、 工作可靠、控制灵活、运行效率高,适于高速与恶劣环境运行等优点, 由其构成的传动系统( Switched Reluctance Drives, SRD) 具有交、直流传动系统所没有的优点, 为此,世界各…...
CMake 构建的Qt 项目中的构建套件的配置
在Qt 框架中,使用CMake 构建工具时,需要自己给构建套件添加相关配置,否则已经添加的构建套件将不可选择使用。 创建CMake 项目后,如果打开项目配置时,出现如下构建套件不可选的情况, 需要先确认是否安装…...
程序化广告行业(34/89):移动端特色广告与创意策略探秘
程序化广告行业(34/89):移动端特色广告与创意策略探秘 大家好!在程序化广告的学习之旅中,每一次探索都像是发现了新大陆。今天,我依旧怀揣着和大家共同进步的想法,来和大家深入聊聊程序化广告行…...
IT行业项目管理风险规避策略
在IT项目中,前端、后端、测试等不同角色的协同工作会带来各种项目管理风险。以下是针对这些风险的规避策略: 一、跨职能团队协作风险 1. 沟通不畅风险 解决方案: 建立每日站会机制(15分钟以内)使用协作工具(如Jira、飞书、钉钉)制定明确的接口文档标准(Swagger/YAPI)…...
24届非科班硕士入职做上位机开发,后续往工业软件还是音视频、后端发展?
今天给大家分享的是一位粉丝的提问,24届非科班硕士入职做上位机开发,后续往工业软件还是音视频、后端发展? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问: …...
Hadoop三 分布式sql计算hive入门
一 分布式SQL计算 对数据进行统计分析,SQL是目前最为方便的编程工具。 大数据体系中充斥着非常多的统计分析场景,所以,使用SQL去处理数据,在大数据中也是有极大的需求的。MapReduce支持程序开发(Java、Python等&#…...
【C++】C++中的动态内存分配(new和delete)
C中的动态内存分配(分配堆空间) 1. C语言与C动态内存分配2. 使用3.malloc和new有什么区别示例代码: 1. C语言与C动态内存分配 C语言 malloc calloc realloc free 函数 C new关键字分配堆空间 delete关键字释放堆空间 2. 使用 第一种&#…...
Go 代理爬虫
现在注册,还送15美金注册奖励金 --- 亮数据-网络IP代理及全网数据一站式服务商 使用代理服务器,通过 Colly、Goquery、Selenium 进行网络爬虫的基础示例程序 本仓库包含两个分支: basic 分支包含供 Go Proxy Servers 这篇文章改动的基础代码…...
推陈换新系列————java8新特性(编程语言的文艺复兴)
文章目录 前言一、新特性秘籍二、Lambda表达式2.1 语法2.2 函数式接口2.3 内置函数式接口2.4 方法引用和构造器引用 三、Stream API3.1 基本概念3.2 实战3.3 优势 四、新的日期时间API4.1 核心概念与设计原则4.2 核心类详解4.2.1 LocalDate(本地日期)4.2…...
蓝桥杯算法实战分享
蓝桥杯算法实战分享 蓝桥杯是国内知名的程序设计竞赛,涵盖算法、数据结构、编程技巧等多个领域。本文将从实战角度分享蓝桥杯算法竞赛的常见题型、解题思路和优化技巧,帮助参赛者更好地备战。 1. 常见题型与解题思路 蓝桥杯的题型主要包括以下几类&…...
树莓集团园区运营案例:成都国际数字影像产业园的运营逻辑
成都国际数字影像产业园的成功运营,是树莓集团在产业园运营领域的典型案例。其运营逻辑可以归纳为以下几点: 一、政企合作,优势互补 园区由树莓集团与金牛区政府合作共建,这种模式充分利用双方的优势。政府提供政策支持、土地资…...
【动态规划】最长公共子序列问题 C++
问题描述 子序列:序列Z是原序列X的子序列,当且仅当Z的元素在X中按严格递增的下标顺序出现(不要求连续)。例如X{A,B,C,B,D,A,B}中,Z{B,C,D,B}是子序列,对应X的下标2→3→5→7。公共子序列:若序列…...
K8s故障排查手册:从Pod崩溃到网络不通
本文基于数百个真实生产环境案例,系统化梳理Kubernetes集群的故障排查方法论。涵盖Pod生命周期异常、服务发现失效、存储卷挂载失败、网络策略冲突等核心故障场景,结合Prometheus监控指标、eBPF深度追踪、CNI插件分析等技术手段,为企业运维团…...
HTML DOM 基础:用「家族树」理解网页操控术
HTML DOM 基础:用「家族树」理解网页操控术 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model),也就是DOM。 DOM 是JavaScript 操作网页的接口,它的作用是将网页转为一个JavaScript 对象,从而可以用脚本进行各种操作(比如对元素增删内容)。 浏览…...
扩展卡尔曼滤波
1.非线性系统的线性化 标准卡尔曼滤波 适用于线性化系统,扩展卡尔曼滤波 则扩展到了非线性系统,核心原理就是将非线性系统线性化,主要用的的知识点是 泰勒展开(我另外一篇文章的链接),如下是泰勒展开的公式…...
【AI News | 20250326】每日AI进展
AI News 1、Gemini 2.5:谷歌DeepMind最智能AI模型亮相 谷歌DeepMind推出Gemini 2.5,其最智能AI模型。首款实验版本Gemini 2.5 Pro在多项基准测试中领先,登顶LMArena榜首,展现卓越的推理与编码能力。该模型为“思考模型”…...
智能汽车图像及视频处理方案,支持视频星轨拍摄能力
美摄科技作为智能汽车图像及视频处理领域的先行者,正以革新性的技术引领着行业的未来发展。美摄科技智能汽车图像及视频处理方案,一个集高效性、智能化、画质增强于一体的创新解决方案,旨在重塑智能汽车图像画质的新标准,并支持前…...
AI-Sphere-Butler之Ubuntu服务器如何部署Nginx代理,并将HTTP升级成HTTPS,用于移动设备访问
环境: AI-Sphere-Butler WSL2 Ubuntu22.04 Nginx 问题描述: AI-Sphere-Butler之Ubuntu服务器如何部署Nginx代理,并将HTTP升级成HTTPS,用于移动设备访问 解决方案: 一、生成加密证书 1.配置OpenSSL生成本地不加…...
SpringBoot项目图片上传成功,访问404
1. 配置文件,静态资源访问路径,记得加上file: 2.上传文件路径 以上配置是正确的,这样才可以正确映射 之前我再配置文件写的是,这是错的, 因为:classpath写法和绝对路径无法匹配 .addResourceLocations("classpat…...
鸿蒙学习笔记(2)-国际化配置、ArkTS简述
一、国际化配置 根据操作系统语言实现手动或者自动切换中英文,提供了多套语言包。编写过程中注意不要将文字写死,将文本放在指定的语言包文件夹中来保存,鸿蒙开发中默认实现中英文的国际化配置。若要实现中英文转化,需要在三个地…...
ES 字段的映射定义了字段的类型及其行为
在 Elasticsearch 中,字段的映射定义了字段的类型及其行为。你提供的 content_answer 字段映射如下: Json 深色版本 "content_answer": { "type": "text", "fields": { "keyword": { …...
游戏引擎学习第183天
回顾和今天的计划 我对接下来的进展感到非常兴奋。虽然我们可能会遇到一些问题,但昨天我们差不多完成了将所有内容迁移到新的日志系统的工作,我们正在把一些内容整合进来,甚至是之前通过不同方式记录时间戳的旧平台层部分,现在也…...
未来二十年的量子计算
在未来二十年间,量子计算领域将迎来翻天覆地的变革,从实验室走向更广阔的应用舞台,重塑众多行业的格局。 在硬件层面,量子芯片的研发将持续精进。超导量子比特技术会不断突破,进一步提升比特数量与质量。当前ÿ…...
SpringBoot通过Map实现天然的策略模式
😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: SpringBoot通过Map实现天然的策略模式 ⏱️ 创作时间: 202…...
MTKAndroid12 解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题
解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题 文章目录 场景参考资料修改文件解决方案日志源码分析 总结 场景 在部分产品中偶发性发现, SystemUI下拉框下拉后长按WIFI图标会导致崩溃问题,有时候是截屏、点击Home 按键后,长…...
Springboot 学习 之 Shardingsphere 按照日期水平分表(二)
文章目录 业务场景依赖配置特别注意优劣参考资料 业务场景 在 报表 等 大数据量 且需要 按照日期显示 的业务场景下,按照 日期水平分表 是一个不错的选择 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-b…...
WordPress超级菜单插件UberMenu v3.78汉化版
一、插件介绍 UberMenu 是一款功能强大的 WordPress 超级菜单插件,能够帮助站长创建响应式、可自定义的多级菜单。该插件支持动态内容加载、图标、图片、搜索框等丰富功能,并且兼容大多数 WordPress 主题。 UberMenu v3.78 经过完整汉化,适用于中文站点用户,让操作更加直观…...
观成科技:海莲花利用MST投递远控木马
概述 “海莲花”,又名“OceanLotus”,该APT组织是长期针对中国境内,且攻击活动十分活跃的组织。近期发现该组织使用了MSI文件滥用的新手法,将远程控制木马植入MST文件来修改MSI文件安装时的执行流程,在安装期间运行恶…...
Node.js系列(5)--数据库操作指南
Node.js数据库操作指南 💾 引言 数据库操作是Node.js应用开发中的关键环节。本文将深入探讨Node.js数据库操作的实现方案,包括连接管理、查询优化、事务处理等方面,帮助开发者构建高效可靠的数据访问层。 数据库操作概述 Node.js数据库操…...
最大异或对 The XOR Largest Pair
题目来自洛谷网站: 思路: 两个循环时间复杂度太高了,会超时。 我们可以先将读入的数字,插入到字典树中,从高位到低位。对每个数查询的时候,题目要求是最大的异或对,所以我们选择相反的路径&am…...
简单介绍My—Batis
1.什么是My—Batis? My—Batis是一个持久层框架,提供了sql映射功能,能方便的将数据库表和java对象进行映射,通过My—Batis可以将项目中的数据存储在数据库中,以便我们进行调用。值得注意的是My—Batis和spring不是一回…...
案例分享|树莓派媒体播放器,重构商场广告的“黄金三秒”
研究显示,与传统户外广告相比,数字户外广告在消费者心中的记忆率提高了17%,而动态户外广告更是能提升16%的销售业绩,整体广告效率提升了17%。这一显著优势,使得越来越多资源和技术流入数字广告行业。 户外裸眼3D广告 无…...
硬件基础(5):(3)二极管的应用
文章目录 [toc]1. **整流电路****功能**:**工作原理**:**应用实例**:电路组成:整流过程:电路的应用: 2. **稳压电路****功能**:**工作原理**:**应用实例**:电路组成及功能…...
数据结构之栈的2种实现方式(顺序栈+链栈,附带C语言完整实现源码)
对于逻辑关系为“一对一”的数据,除了用顺序表和链表存储外,还可以用栈结构存储。 栈是一种“特殊”的线性存储结构,它的特殊之处体现在以下两个地方: 1、元素进栈和出栈的操作只能从一端完成,另一端是封闭的…...
vscode终端不识别npm 无法解析npm
vscode 用以管理员打开识别npm vscode 用普通用户打开不识别npm 刚换了一台新电脑,寻思安装各种环境,一顿操作猛如虎,当最后一个打开vscode后,运行项目发现,新建终端>npm run dev 无法识别。 在cmd 中 打node -…...
java泛型的协变、逆变和不变
引言 我们在看开源框架经常会看到泛型来定义数据类型。 有时候, <? extends T> 和 <? super T> 这样带通配符的泛型参数。 这种通配符的泛型是什么意思怎么用???? 概念 型变: 用来描述类…...
effective Java 学习笔记(第二弹)
effective Java 学习笔记(第一弹) 整理自《effective Java 中文第3版》 本篇笔记整理第3,4章的内容。 重写equals方法需要注意的地方 自反性:对于任何非空引用 x,x.equals(x) 必须返回 true。对称性:对于…...
Spring BeanFactoryPostProcessor 和 BeanPostProcessor有什么用?
BeanFactoryPostProcessor 和 BeanPostProcessor 都是 Spring 框架中非常重要的扩展点,我们在开发中可以利用 Spring 容器实例化 Bean、配置 Bean 以及初始化 Bean 的过程中进行自定义的干预。但它们的作用时机和作用对象不同。 1. BeanFactoryPostProcessor: 作用…...
Centos7 Gitlab17部署
确保你的安装源正常 1.安装依赖项 sudo yum install -y curl policycoreutils-python openssh-server openssh-clients postfix 2.安装Gitlab (1)添加仓库 curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash (2) 安装Gitl…...
一文解读DeepSeek在工业制造领域的应用
引言 在当今数字化浪潮席卷全球的背景下,各个行业都在积极寻求创新与变革,工业制造领域也不例外。然而,传统工业制造在生产效率、质量控制、成本管理等方面面临着诸多挑战。在这一关键时期,人工智能技术的兴起为工业制造带来了新的…...