当前位置: 首页 > news >正文

Mysql笔记-错误条件\处理程序

概念:
条件(Condition)​​:定义需要捕获的错误类型(如 SQL 错误码、SQLSTATE 码或自定义错误名),是触发处理程序的“触发器”。
处理程序(Handler)​:当指定条件触发时,执行的一段 SQL 代码块(如回滚事务、记录日志、返回错误信息)。

1. 条件

1.1 作用

在 MySQL 中,​条件(Condition)​​ 是存储过程函数触发器中用于定义需要捕获的错误类型的核心机制。通过定义条件,可以精准触发后续的处理逻辑(如回滚事务、记录日志、跳过错误等),避免程序因未处理的异常而中断。通过过合理使用处理程序,可以增强数据库应用的健壮性,确保在出现异常情况时能够优雅地处理错误,而不是直接中断程序执行。

1.2 定义语法

使用:定义错误条件(变量),指向SQLSTATE,Mysql错误码,或者自定义条件名,便于后面处理程序使用。

作用域:在 MySQL 中,条件通过 DECLARE CONDITION 语句定义,​必须在 BEGIN…END 块的最开始处声明​(位于所有可执行语句之前),作用域仅限于当前块及其子块。

#定义条件
DECLARE condition_name CONDITION FOR {mysql_error_code | SQLSTATE 'sqlstate_value'};#定义处理程序--辅助这看怎么用,下面细讲
DECLARE {CONTINUE | EXIT} HANDLER FOR {condition_name | SQLSTATE 'code' | mysql_error_code | SQLWARNING | SQLEXCEPTION | NOT FOUND} BEGIN ... END;

定义条件示例:

-- 方法1:直接绑定MySQL错误码
DECLARE no_such_table CONDITION FOR SQLSTATE '42S02';-- 方法2:绑定数值错误码
DECLARE field_not_null CONDITION FOR 1048;-- 方法3:定义业务级条件
DECLARE insufficient_balance CONDITION FOR 'BALANCE_ERROR';
  • SQLSTATE​:遵循 ANSI SQL 标准,跨数据库兼容(如 42S02 在 Oracle 中同样表示表不存在)
  • 错误码​:MySQL 特有扩展,细化到具体功能模块(如 1062 仅针对唯一键约束)

MySQL_error_code是数值类型错误代码。sqlstate_value是长度为5的字符串类型错误代码。

在ERROR 1418 (HY000)中,1418是MySQL_error_code,'HY000’是sqlstate_value。
在ERROR 1142(42000)中,1142是MySQL_error_code,'42000’是sqlstate_value。

1.3 SQLSTATE 分类规则:

前两位数字类别名称含义典型场景示例
00成功操作成功完成00000(无错误)
01警告(WARNING)非致命问题,不影响事务完整性数据截断、隐式类型转换
02无数据(NOT FOUND)查询未返回结果SELECT 无匹配行
08连接异常数据库连接问题网络中断、服务未启动
0A功能限制数据库版本或配置不支持某些功能不支持的字符集或存储引擎
20-26数据异常(DATA)数据格式、类型或约束问题主键冲突、无效日期格式
40事务回滚事务因错误自动回滚死锁、超时
42语法/规则违例SQL 语法错误或违反访问规则关键字拼写错误、权限不足
HY通用错误MySQL 特有错误(非标准 SQLSTATE)表不存在(1146)、权限拒绝(1044

2. 处理程序(Handler)

的处理程序(Handler)是存储过程和函数中实现错误控制的核心机制,通过预定义错误场景和对应的处理逻辑,开发者可以增强程序的健壮性。

2.1 定义语法

DECLARE handler_type HANDLER 
FOR condition_value [, ...] 
sp_statement;
  • ​**handler_type**​:处理策略(CONTINUE/EXIT/UNDO
  • ​**condition_value**​:错误标识(SQLSTATE/错误码/条件名)
  • ​**sp_statement**​:错误处理代码块

2.2 处理策略(handler_type)

类型行为适用场景
CONTINUE继续执行后续语句可忽略的警告(如数据截断)
EXIT终止当前块并回滚事务关键操作失败(如主键冲突)
UNDO回滚事务并撤销操作(Mysql暂不支持)需要事务回滚的业务场景

2.3 常见错误标识(condition_valu

类型/分类定义匹配规则示例
SQLSTATE5字符的字符串错误码,定义SQL标准错误类型精准匹配5字符的SQLSTATE代码(区分大小写)'02000'(查询无结果)、'23000'(外键冲突)
MySQL_error_codeMySQL内部定义的数字型错误代码精准匹配数值代码1062(主键冲突)、1146(表不存在)
错误名称通过DECLARE ... CONDITION自定义的命名错误条件匹配自定义名称绑定的错误代码DECLARE my_error CONDITION FOR 1062;
SQLWARNING警告类错误,表示非致命性问题SQLSTATE以01开头'01000'(一般警告)、'01002'(数据截断)
NOT FOUND无数据/未找到结果错误SQLSTATE以02开头'02000'(SELECT无结果)、'02001'(游标结束)
SQLEXCEPTION
匹配所有没有被SQLWARNINGNOT FOUND捕获的SQLSTATE错误代码
SQLSTATE不以00(成功)、0102开头'23000'(约束冲突)、'HY000'(通用错误)
#方法1:捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info = 'NO_SUCH_TABLE';
#方法2:捕获mysql_error_value
DECLARE CONTINUE HANDLER FOR 1146 SET @info = 'NO_SUCH_TABLE';
#方法3:先定义条件,再调用
DECLARE no_such_table CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info = 'NO_SUCH_TABLE';
#方法4:使用SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARNING SET @info = 'ERROR';
#方法5:使用NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND SET @info = 'NO_SUCH_TABLE';
#方法6:使用SQLEXCEPTION
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info = 'ERROR';

2.4 处理语句

如果出现上述条件之一,则采用对应的处理方式,并执行指定的处理语句。语句可以是
SET 变量 = 这样的简单语句,也可以是使用 BEGIN ... END 编写的复合语句。
#创建一个名称为“InsertDataWithCondition”的存储过程,在存储过程中,定义处理程序,捕获sqlstate_value值,当遇到sqlstate_value值为23000时,执行EXIT操作,并且将@proc_value的值设置为-1。
DELIMITER //
CREATE PROCEDURE InsertDataWithCondition()
BEGIN
DECLARE duplicate_entry CONDITION FOR SQLSTATE '23000' ;
DECLARE EXIT HANDLER FOR duplicate_entry SET @proc_value = -1;
SET @x = 1;//假设department_name是unique的
INSERT INTO departments(department_name) VALUES('测试');
SET @x = 2;
INSERT INTO departments(department_name) VALUES('测试');
SET @x = 3;
END //
DELIMITER ;
#调用存储过程 查看x的值
CALL InsertDataWithCondition();
http://www.dtcms.com/a/336690.html

相关文章:

  • SSM从入门到实践:1.1 Spring框架概述与IoC容器入门
  • 堆(Heap):高效的优先级队列实现
  • duiLib 解决点击标题栏中按钮无响应问题
  • ROS2基础
  • C语言零基础第19讲:自定义类型—联合体和枚举
  • 解锁Java开发神器:XXL-Job从入门到精通
  • BT_LE_ADV_CONN_ONE_TIME 参数详解
  • Spring 创建 Bean 的 8 种主要方式
  • [创业之路-556]:创新的本质是赚不确定性带来的潜在价值,把不确定性逐步转化确定性,周而复始。
  • 产品设计.Ai产品经理
  • 48.Seata认识、部署TC服务、微服务集成
  • 网络中的一些基本概念
  • Conda 环境 在AI 私有化部署 有怎么用?
  • 微信小程序 小白gps工具v0.01 使用说明
  • react echarts图表监听窗口变化window.addEventListener(‘resize’)与ResizeObserver()
  • python -基础(5)组合数据类型
  • 每日两道算法题:DAY3
  • java常见的数据加密
  • 当 AI 开始 “理解” 情感:情感计算技术正在改写人机交互规则
  • Linux 服务:iSCSI 存储服务配置全流程指南
  • 廖雪峰-Java教程-Part02
  • C#高级语法_委托
  • 力扣第463场周赛
  • 17-线程
  • uC/OS - III 系统DEBUG时内核对象统计信息
  • 模拟实现 useEffect 功能
  • 配置 NVIDIA RTX 5090 + sm_120 + flashattention,已跑通一个大模型 ~~
  • clion 如何调试 redis(在 mac 上)
  • AMBA-AXI and ACE协议详解(三)
  • 期望分位数回归模型