数据库主键不自增?

问题是这样的:
在项目中,遇到了一个奇怪的问题,短信应用中,发送短信后,短信一直处于发送中状态,此时将这条发送中的短信删除,然后再新建一个草稿,等到发送出去的消息状态返回,比如返回发送失败,这时候,发现草稿箱的草稿少了一条,而发件箱的短信多了一条,但进入发件箱后,却找不到多的那条短信。

看了一下现象,出现异常的就是那条新增的草稿,看了代码逻辑也没什么问题,都是源码,那会是什么呢?想到这些数据都是从数据库读取的,会不会是数据库的数据有问题呢?

打开短信数据库,果不其然,新增的草稿状态是乱的,本来它的状态应该是草稿,但是数据库中却是“发送失败”。而且,新增的草稿的主键“_id”并不是我想象中的要“跳过”删除掉的短信的主键,而就是那条删掉短信的主键。 如下图所示:

出现问题的数据库

图中,_id为5的那条短信,是一条草稿,本来其type值应该是3,但是这里却显示5。

再回头看了短信源码,发现插入草稿时,它的状态是正常的;而当上一条信息的状态返回时,会在数据库找到上一条短信对应的id,也就是刚才插入草稿的id,将发送后的状态直接插入到了这个新建的草稿中,所以导致的草稿的状态混乱。

那么,为什么“_id”不是增加的,而是复用上一个“_id”?

我们在构建数据库的时候,一般是把主键设为“INTEGER PRIMARY KEY”,一般情况下,主键值和rowId值是相等的(rowId是数据库表维护的一个不可见的值),如果主键设为“INTEGER PRIMARY KEY”,那么新的rowId总是用当前元素最大的rowId+1。所以,当发送中的短信删除后再新建草稿,这条草稿的主键是与上一条被删除短信的主键是相同的。那么如果对“_id”比较敏感,一个主键只能表示一个元素,无论这个元素是否被删除,该如何呢?这时,要将主键设为“INTEGER PRIMARY KEY AUTOINCREMENT”,加上“AUTOINCREMENT”关键字后,这个rowId就一直是递增的了,数据库的元素的主键也不会重复了,问题解决。

以上内容参考了博客:http://blog.csdn.net/hudashi/article/details/6921593
需要更详细地了解,请阅读这篇博客。

另外,还有一个需要考虑的问题:主键设为AUTOINCREMENT后,rowId一直增加,也就是说,用户无论删多少条短信,这个rowId总有一天会达到上限,这时rowId会复用之前没有用过的数字,而主键值一旦突破了上限就会报异常了。不过,看了这个上限,好大好大的数。。。。。。所以我也就没再担心了~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值