mysql insert 错误码_利用 MySQL 自身错误诊断区域-爱可生

原标题:利用 MySQL 自身错误诊断区域-爱可生

9480aa3188eef25bf429546a92124e4a.png

背景

本篇文章来源于今天客户问的一个问题。

问题大概意思是:我正在从 Oracle 迁移到 MySQL,数据已经转换为单纯的 INSERT 语句。由于语句很多,每次导入的时候不知道怎么定位到错误的语句。 如果 INSERT 语句少也就罢了,我可以手工看,不过 INSERT 语句很多,我怎么定位到是哪些语句出错了,我好改正呢?总不能每次遇到的错误的时候改一下,再重新运行继续改正吧?有没有简单点的方法。

其实 MySQL 自身就有错误诊断区域,如果能好好利用,则事半功倍。

演示

下面我来简单说下怎么使用错误诊断区域。

比如说我要插入的表结构为 n3,保存错误信息的日志表为 error_log 两个表结构如下:

-- tables definition.

[ytt]>create table n3 (id int not null, id2 int generated always as ((mod(id,10))));

Query OK, 0 rows affected (0.04 sec)

[ytt]>create table error_log (sqltext text, error_no int unsigned, error_message text);

Query OK, 0 rows affected (0.04 sec)

假设插入的语句,为了演示,我这里仅仅简单写了 8 条语句。

-- statements body.

set @a1 = "INSERT INTO n3 (id) VALUES(100)";

set @a2 = "INSERT INTO n3 (id) VALUES('test')";

set @a3 = "INSERT INTO n3 (id) VALUES('test123')";

set @a4 = "INSERT INTO n3 (id) VALUES('123test')";

set @a5 = "INSERT INTO n3 (id) VALUES(200)";

set @a6 = "INSERT INTO n3 (id) VALUES(500)";

set @a7 = "INSERT INTO n3 (id) VALUES(null)";

set @a8 = "INSERT INTO n3 (id) VALUES(10000000000000)";

MySQL 的错误代码很多,不过总体归为三类:

sqlwarning SQLSTATE 代码开始为 '01'

not found SQLSTATE 代码开始为 '02'

sqlexception SQLSTATE 代码开始非 '00','01','02' 的所有错误代码。

为了简单方便,我们写这些代码到存储过程里。以下为示例存储过程。

-- stored routines body.

drop procedure if exists sp_insert_simple;

delimiter ||

create procedure sp_insert_simple()

l1:begin

DECLARE i,j TINYINT DEFAULT 1; -- loop counter.

DECLARE v_errcount,v_errno INT DEFAULT 0; -- error count and error number.

DECLARE v_msg TEXT; -- error details.

declare v_sql json; -- store statements list.

declare v_sql_keys varchar(100); -- array index.

declare v_sql_length int unsigned; -- array length.

-- Handler declare.

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND -- exception in mysql routines.

l2:BEGIN

get stacked diagnostics v_errcount = number;

set j = 1;

WHILE j <= v_errcount

do

GET stacked DIAGNOSTICS CONDITION j v_errno = MYSQL_ERRNO, v_msg = MESSAGE_TEXT;

-- record error messages into table.

INSERT INTO error_log(sqltext,error_no,error_message) VALUES (@sqltext, v_errno,v_msg);

SET j = j + 1;

END WHILE;

end;

-- sample statements array.

set v_sql = '{

"a1": "INSERT INTO n3 (id) VALUES(100)",

"a2": "INSERT INTO n3 (id) VALUES(''test'')",

"a3": "INSERT INTO n3 (id) VALUES(''test123'')",

"a4": "INSERT INTO n3 (id) VALUES(''123test'')",

"a5": "INSERT INTO n3 (id) VALUES(200)",

"a6": "INSERT INTO n3 (id) VALUES(500)",

"a7": "INSERT INTO n3 (id) VALUES(null)",

"a8": "INSERT INTO n3 (id) VALUES(10000000000000)"

}';

set i = 1;

set v_sql_length = json_length(v_sql);

while i <=v_sql_length do

set v_sql_keys = concat('$.a',i);

set @sqltext = replace(json_extract(v_sql,v_sql_keys),'"','');

prepare s1 from @sqltext;

execute s1;

set i = i + 1;

end while;

drop prepare s1;

-- invoke procedure.

-- call sp_insert_simple;

end;

delimiter ;

我们来调用这个存储过程看下结果。

[(none)]>use ytt

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

[ytt]>call sp_insert_simple;

Query OK, 0 rows affected (0.05 sec)

表N3的结果。

[ytt]>select * from n3;

+-----+------+

| id | id2 |

+-----+------+

| 100 | 0 |

| 200 | 0 |

| 500 | 0 |

+-----+------+

3 rows in set (0.00 sec)

错误日志记录了所有错误的语句。

[ytt]>select * from error_log;

+--------------------------------------------+----------+-------------------------------------------------------------+

| sqltext | error_no | error_message |

+--------------------------------------------+----------+-------------------------------------------------------------+

| INSERT INTO n3 (id) VALUES('test') | 1366 | Incorrect integer value: 'test' for column 'id' at row 1 |

| INSERT INTO n3 (id) VALUES('test123') | 1366 | Incorrect integer value: 'test123' for column 'id' at row 1 |

| INSERT INTO n3 (id) VALUES('123test') | 1265 | Data truncated for column 'id' at row 1 |

| INSERT INTO n3 (id) VALUES(null) | 1048 | Column 'id' cannot be null |

| INSERT INTO n3 (id) VALUES(10000000000000) | 1264 | Out of range value for column 'id' at row 1 |

+--------------------------------------------+----------+-------------------------------------------------------------+

5 rows in set (0.00 sec)

其实这个问题如果用 Python 或 PHP 等外部语言来说,将会更简单,思路差不多。

关键字:爱可生、MySQL数据库、数据库运维管理、开源数据库解决方案返回搜狐,查看更多

责任编辑:

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

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

相关文章

mac版crt8.0.2打开无响应怎么办_Mac电脑程序无响应怎么办?教你强制退出无响应程序...

Mac电脑运行时间长了&#xff0c;难免也会遇到程序卡死无响应的情况&#xff0c;可能是由于程序冲突、缓存不足或者一些bug等情况导致&#xff0c;这个时候我们就需要强制退出这个程序了&#xff0c;一起来看看如何强制退出无响应程序吧&#xff01;快捷键强制退出当前运行的应…

win7如何关闭密码保护共享

1、首先打开控制面板&#xff0c;选择用户账户和家庭安全。 2、其次点击用户账户。 3、然后选择管理其他账户。 4、接着点击Guest&#xff0c;点击启用。 5、之后关闭窗口&#xff0c;右击点击计算机&#xff0c;选择管理。 6、接着按顺序点击本地用户和组、用户&#xff0…

python英文字典小程序_python 小程序—三级菜单—循环和字典练习

程序中利用多级字典来存储三级菜单&#xff0c; 通过一系列while循环和for循环&#xff0c;实现了三级菜单的查询&#xff0c;选择&#xff0c;退回上级菜单&#xff0c;退出程序几个功能。缺点&#xff1a;程序语句过于重复&#xff0c;效率低。#-*-coding:utf-8-*-date{北京:…

win7电脑假死机怎么办

1、正在使用电脑&#xff0c;如果网页或一些页面卡住不动&#xff0c;我们首先要保持电脑的正常运行。这时候可以同时按WinD&#xff0c;可以马上回到桌面。然后尝试着刷新几次。 2、当回到桌面后&#xff0c;我们试着看看是不是运行的软件太多了&#xff0c;造成电脑运行不动…

ubuntu mysql master slave_Ubuntu下MySQL5.5 配置主从(Master Slave)同步

折腾了将近3个小时!终于把mysql的主从同步给配置成功了!网上的不少例子都行不通(也许是版本问题).官网看了一下原版的tutorial,还是比较懵逼.....最后,通过官网的教程和自己的摸索,终于弄好mysql 主从复制了..在此记录一下.1.环境:1.1.vmware 121.2.ubuntu14.041.3.Master Ip:1…

怎么关闭u盘写保护

通过电脑对U盘设置的了写保护。在U盘盘符的上方点击右键&#xff0c;在弹出的菜单中点击属性。 在属性窗口上方找到并点击安全&#xff0c;在安全选项卡中部找到并点击编辑。 在打开的窗口上部选中everyone&#xff0c;然后在下方everyone的权限中勾选完全控制&#xff0c;最后…

win8系统软件不兼容怎么办

1、在出现问题的程序文件上右键单击&#xff0c;将弹出一个快捷菜单&#xff0c;在该菜单中找到“兼容性疑难解答”这一项&#xff0c;单击它; 2、这时&#xff0c;将弹出“程序兼容性疑难解答”的“正在检测问题”进度状态&#xff0c;您需要根据情况等待片刻; 3、检测完毕&…

怎么提升笔记本显卡性能

1、打开控制面板&#xff0c;点击硬件和声音。 2、硬件和声音页面&#xff0c;点击电源选项。 3、系统默认电源计划为平衡&#xff0c;点击更改计划设置。 4、进入电源计划编辑页面&#xff0c;点击更改高级电源设置。 5、电源选项窗口&#xff0c;点击可切换动态显卡&#…

win10桌面不停自动刷新闪屏解决方法

1、右键点击桌面上的此电脑&#xff0c;然后点击管理; 2、然后双击服务与应用程序&#xff0c;展开它; 3、再双击服务; 4、然后找到Problem Reports and Solutions Control Panel Support&#xff0c;点击左侧的停止&#xff0c;或者右键后停止; 5、接着找到Windows Error R…

防止u盘中毒的方法

防止u盘中毒的方法是什么&#xff0c;下面一起来看看吧。 方法一、通过修改注册表来阻断U盘病毒 即使关闭了自动播放功能&#xff0c;但是还是会在双击盘符的时候入侵系统&#xff0c;通过修改注册表来阻止U盘病毒&#xff0c;但是U盘病毒依然会在双击盘符时入侵系统&#xff…

win10 dns异常上不了网如何解决

遇到win10 dns异常上不了网如何解决呢&#xff0c;接下来就给大家讲述一下win10系统dns异常上不了网的修复步骤。 1、首先&#xff0c;我们单击左下角的开始菜单按钮&#xff0c;然后右键单击命令提示符选项。 2、然后&#xff0c;我们复制以下命令&#xff1a;ipconfig / flu…

python创建变量revenue、并赋值为98765_第七章:Python之数据库编程

第一节:数据库API与全局变量及核心类基本流程数据库APIpython DB API 2.0 通过全局变量查看 DB API特性全局变量用于判断该数据库模块所支持的功能,通常有以下3个全局变量apilevel:显示数据库模块的API版本号 threadsafety:指定该数据库模块的线程安全等级 paramstyle:指定…

win7电脑麦克风有电流声怎么办

1、因为我们音量设置不合理造成的现象&#xff0c;音量如果过大的话&#xff0c;很容易会造成麦克风出现杂音的产生&#xff0c;所以我们要合理控制音量&#xff0c;避免出现类似的现象; 2、麦克风本身质量就存在有问题。可以在别的电脑上面进行尝试&#xff0c;看看是不是这个…

win10搜索框没反应怎么修复

1、任务管理器中&#xff0c;点击文件&#xff0c;选择运行新任务。 2、在运行新任务窗口输入PowerShell&#xff0c;勾选以系统管理权限创建此任务&#xff0c;点击确定。 3、在PowerShell终端中&#xff0c;输入命令并执行&#xff0c; Get-AppXPackage -AllUsers | Foreac…

java axis2 教程_webservice的Axis2入门教程java版

本文转自百度文库Axis2是一套崭新的WebService引擎&#xff0c;该版本是对Axis1.x重新设计的产物。Axis2不仅支持SOAP1.1和SOAP1.2&#xff0c;还集成了非常流行的REST WebService&#xff0c;同时还支持Spring、JSON等技术。这些都将在后面的系列教程中讲解。在本文中主要介绍…

如何打开win10 iis管理器

1、同时按住【Windows】【R】快捷键&#xff0c;输入【控制面板】进入控制面板界面。 2、鼠标点击【程序】&#xff0c;选择【启动或关闭windows功能】。 3、将页面的相应选项进行勾选&#xff0c;再点击【确定】就可以打开iis管理器了。 4、返回控制面板界面&#xff0c;鼠标…

win8的开始菜单不见了怎么办

win8的开始菜单不见了怎么办?下面解决Win8开始菜单不见了的方法分享给大家。 一、开始菜单的图标不见了 Win8开始菜单不见了的情况有很多种&#xff0c;而不少用户是Win8开始菜单的图标不见了&#xff0c;可通过重新下载安装解决&#xff0c;具体步骤如下&#xff1a; 1、前…

java中的io复用_从 Java 中的零拷贝到五种IO模型

在之前的文章中&#xff0c;我们聊过了 Java 中的零拷贝&#xff0c;零拷贝就是指数据不会在内核空间和用户空间之间相互拷贝。这样就减少了内核态与用户态的切换&#xff0c;自然就很高效。拷贝文件只是 IO 操作中一个特殊的情况&#xff0c;大多数的 IO 操作还是需要将数据从…

java 图像梯度检测_数字图像处理-边缘检测

梯度介绍首先介绍边缘检测中用到的高等数学原理---梯度。介绍梯度&#xff0c;离不开方向导数。方向导数顾名思义&#xff0c;方向导数就是某个方向上的导数。什么是方向&#xff1a;函数在这个方向上的图像&#xff1a;我们知道&#xff1a;函数的点在这个方向上也是有切线的&…

java 查找排序_查找与排序算法(Java实现)

1、二分查找算法package other;public class BinarySearch {/** 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据*/public static int binarySearch(int[] arr, int x) {int low 0;int high arr.length-1;while(low < high) {int middle (low hig…