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,一经查实,立即删除!

相关文章

win7打不开qq文件怎么办

1、这种情况是因为QQ为了用户安全&#xff0c;防止传过来的文件是病毒&#xff0c;在电脑上自动运行而做的修改&#xff0c;针对的是.EXE等WINDOWS系统可执行的文件&#xff0c;会自动在文件名称后面加上.重命名三个字。如果确认不是病毒&#xff0c;在该文件点击右键&#xff…

mysql子查询_笔记之MySQL子查询

子查询students(学生表)&#xff0c;scores(成绩表)、courses(课程表)子查询&#xff1a;在select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句&#xff0c;子查询分(标量子查询、列子查询、行子查询、表子查询)标量子查询: 子查询返回的结果…

win7开机后所有程序都打不开怎么办

win7开机后所有程序都打不开怎么办?下面一起来看看解决方法吧。 win7开机后所有程序都打不开怎么办 方法一&#xff1a; 1、开机按F8进入安全模式; 2、安装杀毒软件&#xff0c;全盘杀毒; 3、重启电脑电脑可以正常使用。 方法二、系统故障或病毒彻底损坏系统无法修复&am…

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

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

win7自带防火墙怎么关闭

1、首先点击win7系统的开始菜单&#xff0c;在菜单中找到并点击打开“控制面板”; win7自带防火墙怎么关闭 2、进入控制面板后&#xff0c;点击窗口右上角的查看方式的“类别”&#xff0c;选择大图标显示; 3、接着在界面里面选择并打开“Windows防火墙”; 4、进入Windows防…

python拼写_python 拼写检查器

简短到爆的py脚本import refrom collections import Counterdef words(text):return re.findall(r\w,text.lower())Words Counter(words(open(big.txt).read()))def P(word,Nsum(Words.values())):return Words[word] / Ndef correction(word):return max(candidates(word), k…

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;最后…

django和mysql如何建模_Django如何设计数据模型

app中的models建立好了后&#xff0c;并不会自动地在数据库中生成相应的数据表&#xff0c;需要你手动创建。进入Pycharm的terminal终端&#xff0c;执行下面的命令&#xff1a;python manage.py makemigrations(venv) D:\work\2019\for_test\mysite>python manage.py makem…

win8系统软件不兼容怎么办

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

怎么提升笔记本显卡性能

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

学生学籍管理系统jsp源代码 MySql_jsp学籍管理系统——mysql+java web

【实例简介】基于java web的简单的学籍管理系统&#xff0c;有数据库。数据库有4个表。没有MVC架构。适合刚刚进门的jsp程序开发学习&#xff01;本人的运行环境是Eclipse EEtomc7.0jre1.7载入的jar包有&#xff1a;msbase.jar、msutil.jar、mysqlserver.jar。mysql数据库密码为…

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

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

php如何将mysql数据库中的admin字段赋值给session_转php中使用session_set_save_handler()函数把session保存到MySQL数据库实例...

PHP保存session默认的是采用的文件的方式来保存的&#xff0c;这仅仅在文件的空间开销很小的windows上是可以采用的&#xff0c;但是如果我们采用 uinx或者是liux上的文件系统的时候&#xff0c;这样的文件系统的文件空间开销是很大的&#xff0c;然而session是要时时刻刻的使用…

防止u盘中毒的方法

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

python创建sqlite3 unicode error_python/sqlite3:发生异常:sqlite3.operationalerror

我正在尝试创建一个函数来处理API错误消息,但是我在python中得到了这个错误消息:Exception has occurred: sqlite3.OperationalErrornear "Test4": syntax error服务器响应为:{"message":"Failed to validate one or more request parameters",&…

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

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