关于sybase表自增字段的坑


    昨晚在开发的时候遇到了sybase的各种坑,虽然最后成功解决了,但却严重推迟了我项目上线的时间,对于sybase我也是无力吐槽了!!!

    首先跟以往正常的一样,我在sybase数据库中创建了一张表,其中将该表的主键id设为了自增,即”id numeric(18,0) NOT NULL IDENTITY(1,1)“。我在开发相对应的功能模块插入数据时看起来好好的,id字段都是从1开始,而且也是自增l量为1。没想到进行提交给测试人员测试时居然报了这个错误,如下图所示:

在这里插入图片描述

没想到居然报错了,而且居然是数值溢出!!这就奇怪了,我代码中使用int类型来定义id,难道插入一条数据的id有那么大吗?我就不信了!于是我查看了下相关报错信息,一看发现。。。。。
在这里插入图片描述
    哇靠,数字尽然达到了15位,什么概念,int最大值才是2147483647,也就是才10位,那肯定数据溢出了,那还用问吗?当时我就想换成long类型,long最大值为”9223372036854775807“,呵呵,看你大还是不大。换成long看起来确实是可以解决的,但是代码改动挺大的,所以想想就放弃了。我看了下这个表的数据,非常有意思,前4行数据的id都是从1到4的,但是到了第5行达到了15位。这怎么可能呢?而且数据才这么5条,哪来的这么大数据呢??于是经过漫长的分析,发现有人使用了set identity_insert 表名 on的操作进而插入了15位的id,然后再set …off掉。其实插入这么大的id也没事,关键是sybase具有记忆功能!没错,**sybase是具有记忆功能的!!!**你插入了这么大的id,它以后都会从这个这15位的id开始了,那我就呵呵了!!

    当时也是费了很长时间才解决!先是尝试删除表中全部的数据,重新插入一条新的数据,但是id仍然是那可怕的15位,后来我想将那张表的主键id改成int,再重新插入新的一条数据时报了"data truncation"(数据截断)的错误,也就是表插入一条数据的id永远都会是15位的,你别想就这样把它缩小到1位的,不存在的!!但真得不存在吗?我就不信了,于是我采取了暴力的方法,drop掉整张表,然后再创建一张相同表结构的表,重新插入一条数据时发现id果然已经从1开始了,刹那间真是太开心了!!!!

    其实sybase在各方面的性能已经远不如其它数据库如mysql,oracle等等那么智能,但依然可以从中学到很多东西!算是当作一个入坑填坑的过程吧!

发布了17 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Melo_FengZhi/article/details/86099983