存储过程、存储函数与触发器详解(MySQL 案例)

存储过程、存储函数与触发器详解(MySQL 案例)


一、存储过程(Stored Procedure)
定义
存储过程是预先编译好并存储在数据库中的一段 SQL 代码集合,可以接收参数、执行逻辑操作(如条件判断、循环),并返回结果。它类似于编程中的函数,但专注于数据库操作。

用途

  1. 封装复杂业务逻辑,减少重复代码。
  2. 提高性能(预编译减少解析时间)。
  3. 减少网络流量(客户端调用一次即可执行多语句)。
  4. 增强数据安全性(通过权限控制访问)。

参数类型

  • 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 语句返回结果,通常用于计算或转换数据。

与存储过程的区别

  1. 函数必须返回一个值,过程可以没有返回值。
  2. 函数可在 SQL 语句中直接调用(如 SELECT),过程需用 CALL
  3. 函数参数均为 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)
定义
触发器是自动执行的存储程序,响应特定表上的 INSERTUPDATEDELETE 事件,分为 BEFORE(操作前)和 AFTER(操作后)两种时机。

用途

  1. 数据审计(记录修改日志)。
  2. 强制业务规则(如字段校验)。
  3. 级联操作(自动更新关联表)。

示例
案例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/INOUTIN 参数
应用场景复杂业务逻辑计算或数据转换数据审计、强制规则

五、注意事项(MySQL)

  1. 使用 DELIMITER 修改分隔符以避免语法冲突。
  2. 触发器需谨慎设计,避免递归触发(如触发器内修改自身表)。
  3. 存储过程和函数需数据库 CREATE ROUTINE 权限。

通过合理使用存储过程、函数和触发器,可以显著提升数据库操作的效率和安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python:进程间的通信,进程的操作队列

进程间的队列&#xff1a; 队列的基本操作&#xff1a; 入队&#xff1a;将数据放到队列尾部 出队&#xff1a;从队列的头部取出一个元素 maxsize&#xff1a;队列中能存放数据个数的上限(整数)&#xff0c;一旦达到上限插入会导致阻塞&#xff0c;直到队列中的数据被消费掉 …

【C++初阶】--- 类与对象(中)

1.类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;我们主要需要掌握前4个&#xff0c;后两个了解以下即可&#xff0c;默认…

python处理音频相关的库

1 音频信号采集与播放 pyaudio import sys import pyaudio import wave import timeCHUNK 1024 FORMAT pyaudio.paInt16 CHANNELS 1#仅支持单声道 RATE 16000 RECORD_SECONDS 3#更改录音时长#录音函数&#xff0c;生成wav文件 def record(file_name):try:os.close(file_…

[M模拟] lc2711. 对角线上不同值的数量差(对角线遍历+前后缀分解)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;2711. 对角线上不同值的数量差 前置题&#xff1a; [M模拟] lc3446. 按对角线进行矩阵排序(对角线遍历公式推导模板题) 矩形的对角线遍历的基础题。 题单&#xff1a; 待补充 2. 题目解析 2025年03月25日…

设计一个基于机器学习的光伏发电功率预测模型,以Python和Scikit - learn库为例

下面为你设计一个基于机器学习的光伏发电功率预测模型&#xff0c;以Python和Scikit - learn库为例。此模型借助历史气象数据和光伏发电功率数据来预测未来的光伏发电功率。 模型设计思路 数据收集&#xff1a;收集历史气象数据&#xff08;像温度、光照强度、湿度等&#xf…

洛谷 P1351 [NOIP 2014 提高组] 联合权值(树)

题目描述 无向连通图 G 有 n 个点&#xff0c;n−1 条边。点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi​&#xff0c;每条边的长度均为 1。图上两点 (u,v) 的距离定义为 u 点到 v 点的最短距离。对于图 G 上的点对 (u,v)&#xff0c;若它们的距离为 2&#xff0c;则它们之间…

YoloV8训练和平精英人物检测模型

概述 和平精英人物检测&#xff0c;可以识别游戏中所有人物角色&#xff0c;并通过绘制框将人物选中&#xff0c;训练的模型仅仅具有识别功能&#xff0c;可以识别游戏中的视频、图片等文件&#xff0c;搭配Autox.js可以推理&#xff0c;实现实时绘制&#xff0c;但是对手机性…

智能汽车图像及视频处理方案,支持视频实时拍摄特效能力

在智能汽车日新月异的今天&#xff0c;美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;凭借其卓越的技术实力和前瞻性的设计理念&#xff0c;为全球智能汽车制造商带来了一场视觉盛宴的革新。美摄科技推出智能汽车图像及视频处理方案&#xff0c;一个集高效性、智…

架构设计之自定义延迟双删缓存注解(下)

架构设计之自定义延迟双删缓存注解(下) 小薛博客官方架构设计之自定义延迟双删缓存注解(下)地址 为了保证Cache和ClearAndReloadCache的灵活性&#xff0c;特意加入EL表达式解析 1、Cache package com.xx.cache;import java.lang.annotation.*; import java.util.concurren…

rosbag|ROS中.bag数据包转换为matlab中.mat数据类型

代码见代码 msg_dict中设置自定义消息类型 test_config中设置需要记录的具体的值 test_config中topic_name以及message_type照搬plotjuggler打开时的参数 最后生成.mat文件在matlab中进行使用

基于动态 FOF(基金中的基金)策略的基金交易推荐系统的设计与实现思路

下面为你呈现一个基于动态 FOF&#xff08;基金中的基金&#xff09;策略的基金交易推荐系统的设计与实现思路&#xff0c;同时给出一个简单的 Python 示例代码。 系统设计 1. 需求分析 收集各类基金的历史数据&#xff0c;涵盖净值、收益率、风险指标等。依据动态 FOF 策略…

搭建主从DNS、nfs、nginx

任务需求&#xff1a; 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容为&#xff1a;Very good, you have successfully set up the system. 各个主机能够实现时间同步&#xff0c;…

JS 对象转数组,数组转对象

数据格式 objMap : {apiP: 8000, sder: true, host: "1.111", wPort: "1335" }要求&#xff1a;将 objMap 转化为 数组 const equipArray Object.keys(objMap ).map(key > {return {name: key,value: objMap [key]}打印结果 数组转为对象 let equipAr…

vue - [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update error.

问题描述&#xff1a; vue项目中&#xff0c;对表单数组赋值时&#xff0c;控制台抛出警告&#xff1a; 问题代码&#xff1a; 问题分析&#xff1a; 1、Vue 要求每个虚拟 DOM 节点必须有唯一的 key。该警告信息通常出现在使用v-for循环的场景中&#xff0c;多个同级节点使用…

DeepSeek V3–0324 vs DeepSeek-V3, 排名最高非推理模型

最近DeepSeek V3 升级。 本文将带您了解该模型的核心特性、基准表现,以及如何通过Hugging Face推理终端和OpenRouter平台亲身体验。我们还将通过创意生成与逻辑分析两大测试案例,直观展示其卓越性能。 DeepSeek-V3-0324 2025年3月24日,深度求索(DeepSeek)AI正式发布了V3…

docker使用uv安装依赖

官方使用 FastAPI 官方 Dockerfile 中用了两次&#xff1a; RUN --mounttypecache,target/root/.cache/uv \--mounttypebind,sourceuv.lock,targetuv.lock \--mounttypebind,sourcepyproject.toml,targetpyproject.toml \uv sync --frozen --no-install-project # ✅ 第一次…

3.0 Disruptor的使用介绍(一)

Disruptor: 其官网定义为&#xff1a;“A High Performance Inter-Thread Messaging Library”&#xff0c;即&#xff1a;线程间的高性能消息框架&#xff0c;与Labview的生产者、消费者模型很相似。 其组成部分比较多&#xff0c;先介绍几个常用的概念&#xff1a; …

在 Windows 系统下,将 FFmpeg 编译为 .so 文件

1. 准备环境 确保你的 Windows 系统已安装以下工具&#xff1a; Android Studio NDK&#xff08;Native Development Kit&#xff09; MSYS2&#xff08;用于提供类 Unix 环境&#xff09; FFmpeg 源码 Git Bash&#xff08;可选&#xff0c;推荐使用&#xff09; 安装 …

leetcode二叉树3

404.左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24示例 2: 输入: root [1] 输…