目录
MySQL错误处理
关于错误处理就是——定义条件和处理程序
对于特定条件的特殊处理——这些条件可以是——错误,子程序的一般流程
定义条件
#定义条件
declare condition_name condition for [condition_type];
#[condition_type]参数
sqlstate [value] sqlstate_value | mysql_error_code
#举例
declare command_not_allowed condition for sqlstate '42000';
declare command_not_allowed condition for 1142;
condition_name | 表示条件的名称,定义后用于declare handler处理语句当中 |
condition_type | 条件的类型,有sqlstate_value 和 mysql_error_code 可选 |
sqlstate_value MySQL_error_code | 都用于代表MySQL的错误, sqlstate_value代表长度为5的字符串类型错误代码,MySQL_error_code代表数值类型的错误代码 |
condition_type参数解析
举例一个名为 ERROR 1142(42000)的错误类型
此时
MySQL错误 | 定义错误 |
sqlstate_value = 42000 | declare command_not_allowed condition for sqlstate '42000'; |
MySQL_error_code = 1142 | declare command_not_allowed condition for 1142; |
关于错误类型请翻到文章最底下
定义处理程序
#语法
declare handler_type handler for condition_value [,…] sp_statement
#handler_type参数
handler_type:
continue | exit | undo
handler_type参数
handler_type(错误处理类型) | 处理方式 |
continue | 不处理,继续执行 |
exit | 遇到错误直接退出 |
undo | 撤回之前的操作 (但MySQL好像不支持) |
condition_value参数
错误类型 | |
---|---|
sqlstate[value] sqlstate_value | 包含5个字符的字符串错误值 |
condition_name | 表示declare condition 定义的错误条件的名称 |
sqlwarning | 匹配所有以01开头的sqlstate错误代码 |
not found | 匹配所有以02开头的sqlstate错误代码 |
sqlexception | 匹配所有没有被sqlwarning或not found捕获的sqlstate错误代码 |
MySQL_error_code | 匹配数值类型错误代码 |
根据不同的错误类型定义不同的处理程序,举例
错误类型 | 处理例 |
sqlstate[value] sqlstate_value | declare continue handler for sqlstate '42S02' set @info="no_such_table"; |
condition_name 自定义的错误类型名 | 先定义一个错类:declare no_such_table condition for 1146; 定义处理该错误: declare continue handler for no_such_table set @info="NO_SUCH_TABLE"; |
sqlwarning | declare exit handler for sqlwarning set @info="ERROR"; |
not found | declare exit handler for not found set @info="NO_SUCH_TABLE"; |
sqlexception | declare exit handler for sqlexception set @info="ERROR"; |
MySQL_error_code | declare continue handler for 1146 set @info="NO_SUCH_Table"; |
MySQL常见的错误类型及其错误代码
MySQL常见错误类型 | sqlstate_value | MySQL_error_code |
创建表失败 | 1005 | HY000 |
无法创建数据库 | 1006 | HY000 |
数据库已存在,创建数据库失败 | 1007 | HY000 |
数据库不存在,删除数据库失败 | 1008 | HY000 |
删除数据库文件失败 | 1011 | HY000 |
不能读取系统表中的记录 | 1012 | HY000 |
关键字重复,更改记录失败 | 1022 | 23000 |
关闭时发生错误 | 1023 | HY000 |
记录不存在,找不到记录 | 1032 | HY000 |
数据表只读,无法修改 | 1036 | HY000 |
系统内存不足 | 1041 | HY000 |
无效的主机名 | 1042 | 08S01 |
无效连接 | 1043 | 08S01 |
拒绝用户访问数据库 | 1044 | 42000 |
不能连接数据库,用户名或密码错误 | 1045 | 28000 |
字段不能为空 | 1048 | 23000 |
数据库不存在 | 1049 | 42000 |
数据表已经存在 | 1050 | 42S01 |
未知表 | 1051 | 42S02 |
未知列 | 1054 | 42S22 |
无效sql语句或sql语句为空 | 1065 | 42000 |
不能建立Socket连接 | 1081 | 08S01 |
连接数据库失败,没有连接权限 | 1130 | HY000 |
数据库用户不存在 | 1133 | 42000 |
当前用户无权访问数据库 | 1141 | 42000 |
当前用户无权访问数据表 | 1142 | 42000 |
当前用户无权访问数据表中的字段 | 1143 | 42000 |
数据表不存在 | 1146 | 42S02 |
该用户没有对表的某某权限 | 1147 | 42000 |
SQL语句语法错误 | 1149 | 42000 |
字段值重复入库失败 | 1062 | 23000 |
唯一约束导致字段值重复,更新记录失败 | 1169 | 23000 |
打开数据表失败 | 1177 | 42000 |
提交事务失败 | 1180 | HY000 |
回滚事务失败 | 1181 | HY000 |
加锁超时 | 1205 | HY000 |
权限不足 | 1227 | 42000 |
MySQL版本过低,不具备此功能 | 1235 | 42000 |