Incorrect integer value: 'null' for column 'T1' at

该问题的由来:
 见我的另一篇文章(http://my.oschina.net/u/1462678/blog/227170)那个visio图片
 
伪sql语句: (database1 和 database2 中的table1 相同的结构,重要的是有个auto_increment 性质的id 列)
    

select *from database1.table1 

insert into table1 values(null,value1,value2,value3,value4);

table1的建表语句:
 

 CREATE TABLE `table1` (

    `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT  ,

    `DNT` datetime DEFAULT NULL,

    `T1` int(10) DEFAULT NULL,

    `T2` int(10) DEFAULT NULL,

    `T3` int(10) DEFAULT NULL,

    `T4` int(10) DEFAULT NULL,

    `T5` int(10) DEFAULT NULL,

    `T6` int(10) DEFAULT NULL,

    `T7` int(10) DEFAULT NULL,

    `T8` int(10) DEFAULT NULL,

    `T9` int(10) DEFAULT NULL,

    `T10` int(10) DEFAULT NULL,

    `W1` int(10) DEFAULT NULL,

    `W2` int(10) DEFAULT NULL,

     PRIMARY KEY (`ID`)

  ) ENGINE=InnoDB  AUTO_INCREMENT =1 DEFAULT CHARSET=utf8;


table1中的数据量:
          8万多条数据,20M实际大小
报错:

        java.sql.SQLException: Incorrect integer value: 'null' for column 'T1' at row 58060 

 查看导致报错的语句:   

         insert into table1 values(null,value1,value2,value3,value4);
         该语句中有个null 的value值,其目的其一是id是auto_increment列,其二我要短时间内操作1万左右张表,每张表之间是不同的,没法指定表的列名
  
报错分析:
         1、看到错误的那一刻我以为是我的表里id为58060的T1列是空值,但是当去select该列的时候,该列的数据表中有数据
     2、然后我想着把insert语句print出来,但是因为数据量的原因,导致打印出来ecplise奔溃,果断改为写文本,但是写下来的文本中没办法看到null的数据(好吧果断将数据表中有空值的想法抛弃了);
     3、然后我开始怀疑我的java程序(因为我的java程序是通过将A服务器上的数据拿过来经过字符串(bufferbulider方式处理)的拼接,拼接出自己的insert语句,之后插入到B服务器中的表)bufferbuilder的处理有问题,当我使用eclipse的debug方式处理的时候看到有的bufferbuilder中的值是空值,此时脑子中想的都是垃圾处理啊,总之就是以为处理过程中程序写的有问题,闹出来的空值;
     4、但是当我就让程序报错,一直执行,出现的状况是有些个表的insert是OK的,然后我可以可定的是我的程序没问题;
     5、这样的结果就是我自己把自己绕住了,走进一个圈里,出不来了,只得求助我的技术主管(主管就是主管,听了我的问题分析,他就下手了,我觉得因为他是局外人,首先怀疑的是数据表中有空值,但是呢他丫没直接说就是改了改我的代码然后找到了数据表中的空值,显得好牛逼啊)
     6、其中有个重要的东西是我的数据data 取过来后 因为考虑数据量大的原因所以手动分批次提交数据,然后一张表如果分为4份来提交可能前边俩份数据可以正常提交,但是后边遇到数据有问题的行时候报了错,Incorrect integer value: 'null' for column 'T1' at row 58060

 
最终结果:

         1、数据表中有空值;
          2、这个跟网上说的 java.sql.SQLException: Incorrect integer value: '' for column 'id' at row 1  这样的错误是没半毛钱关系
          3、主要原因是我手动分批次提交了,导致对java.sql.SQLException: Incorrect integer value: 'null' for column 'T1' at row 58060 的理解出现偏差,简单来说是这样的,如果你的数据有80000条,分20000提交一次,40000提交一次,60000提交一次,80000提交一次,然后这个错误实际上说的是60000提交那次报的错(在该次提交中58060 的条中T1是空值,而事实上就是这样),可惜我完全忘记了我手动分批次提交对mysql驱动来说每次提交都是一个new commit ,好尴尬。


收获:
         1、每一次做程序前,需要认真的做分析,各种分析,对每一种要处理的问题划分下来各个击破;
          2、做程序,思维很重要,当遇到问题的时候最好用排除法将问题的范围缩小,定位,解决;
          3、当问题无法解决是,停下,看看是否那里不对劲,最好对已经排除的问题再次怀疑一次(越觉得可靠的地方往往是问题的高发地带);
          4、记得将每次遇到的问题总结下来,这是一笔财富;

 

 

转载于:https://my.oschina.net/u/1462678/blog/227295

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值