当前位置:C++技术网 > 资讯 > MySQL自增字段索引值到顶的大坑,坑着你摸不着北

MySQL自增字段索引值到顶的大坑,坑着你摸不着北

更新时间:2016-08-08 22:57:56浏览次数:1+次

    因为添加数据失败,然后去调试解决,然后中间来了一个小插曲,就是这篇文章说的:《用惨痛的经历告诉你Python奇葩语法:代码缩进不是为了排版》。插曲的问题就是Python的缩进语法。
    然后,知道了Python这个缩进问题,加代码就不是问题了。前面插曲文章说了,要调试后台程序,只好用写日志。现在搞定了Python语法,就可以大展拳脚了。然后我在每一个函数调用或者关键模块前后都写一个日志,如果写的内容到了文件里,那么就表明前面的代码是OK的。开始是一个个部分来确定,然后发现前面的代码都是正确的。然后后面的代码很多,所以,就全面铺开来,一次性将大部分的关键位置加上了日志代码,然后再运行,一看就知道程序的逻辑是怎么跑的,然后从哪里开始就没有日志了。这样一来,可以熟悉代码流程,而是可以调试找到出问题的点,一举两得。如果你想更快的定位,可以从后往前来找,或者跳着打日志,这样可以加速调试找到Bug的速度。不过,这样并不能很好的熟悉代码的流程。
    就这样,很快就锁定了Bug的位置,在一个插入数据库数据的函数调用里。数据库的错误,如果使用程序里面找问题,那太困难了。在数据库相关代码找错误的最好的办法就是,在代码中提取出运行时的SQL语句,然后转入数据库工具输入SQL语句来执行。如果执行成功,就说明SQL语句没有问题,那就是程序的问题。当然,这里一般都是SQL语句的拼接之类导致错误,或者SQL执行结果错误等,比如违反了数据表的相关约束条件。而且,提取到SQL语句拿到数据库管理工具查询,得到的错误信息更加清晰,而且调试更加方便,我们可以直接根据错误提示来修改SQL语句,直到解决问题为止。
    这里还要提醒一下,在调试Python的代码,为什么后面的日志会无法写到文件里呢?因为Python语言是解释性的脚本语言,所以读取一句执行一句。当遇到一行代码是错误的,就崩溃了。程序就不再往后执行了。所以后面的日志就不会写入日志文件了。然后前面能够写入日志的内容所在的语句,是正确的语句执行之后得到的。通过两边夹击,就准确的得到Bug的位置。我就是根据这个原理来确定准确的错误点。
    到了这个错误点后,然后将程序拼接成的SQL语句写到日志文件里,然后查看日志文件里输出的SQL语句,拿去数据库工具查询进一步调查。这里的日志文件就是一个txt文件。写日志的函数就是C语言一样的文件写数据函数,不过这里是在Python语言中而已,自然是用的Python的文件函数咯。
    所以,调试方法都是最基本的。有些代码里有一个日志库,包括各种写日志的类,让人感觉好高大上,好像自己很难掌握一样,其实就是写一个文件那么简答。
    因为我电脑出了点问题,所以数据库管理工具没法用了。所以就直接在Linux终端 (超级终端软件下载)进入mysql的命令行环境,然后敲命令来查看。执行了语句提示了主键索引太大了。因为现在不在公司,所以那个错误提示也记不清楚了。主要意思就是主键对应的字段是自增的,这个字段你不需要设置值,在每次插入数据表数据的时候,这个值会自动加1。然而此时提示的是,这个自增值到顶了。好神奇!!数据库中的数据才几十条,就到顶了。而且字段是一个很大的整数。
    然后我查看了表的数据,发现主键字段有一个很大的值,也就是主键字段数据类型的最大值。然后就知道问题了。主键字段值已经是最大值了,已经无法自增了。所以,插入数据时就报错了。
    知道了问题,也就好解决问题了。既然是无法自增了,那么我将主键这个最大的自增值删除,这样不就腾出一个位置了嘛。删除后,再在网页添加数据,成功!成功之后,再添加一个数据,失败!这是很自然的,因为第一个成功的不就把最后一个坑给占了嘛,后续的就没有了。
    这是因为,数据表的自增索引已经加到了倒数第二个值,即使删掉这个最大值的这条数据,也只是腾出一个空位来。虽然数据表数据并不多,因为在操作数据表时,手动添加数据时,将这个数值设置成了很大的一个值,一下子把自增索引值拔高到很大的样子了。然后就回不去了,就遇见了这样的尴尬:数据没有多少,却用完了所有自增值。
    那么这个最终的解决办法还是很好说的,那就是修改表定义,将自增值降回原来的真实的水平,但是不能低于已存在的索引值的大小。然后这样后续的自增值就会在新设置的自增索引值开始往上加。如果不知道MySQL命令如何设置自增索引值,可以用数据库管理工具来设置,可视化界面设置更加方便简单。如果你想用命令设置,想用程序来设置,可以自己查一下这个命令。
    至此,问题就已经解决了。从网页前端传来的一个问题,通过js脚本,定位到后台python页面,然后通过python代码逐步定位到出错的函数,定位到数据库插入的函数,得到SQL语句,然后在SQL命令行或者数据库可视化管理工具执行得到的SQL语句,通过提示的错误信息,得到自增索引到顶的问题。最后的解决办法就是,重新设置一下自增索引就可以了。
    而最终这个问题,可能你从来没有遇见过,也没有想过,就这样给硬生生的碰上了。这个解决过程,其实还是挺有意思的。做程序开发,很多时候就是这样过来调试找bug,最后解决Bug一般都是比较容易的。