数据库主键不自增?

数据库主键不自增?

问题是这样的:

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

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

打开短信数据库,果不其然,新增的草稿状态是乱的,本来它的状态应该是草稿,但是数据库中却是“发送失败”。而且,新增的草稿的主键“_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会复用之前没有用过的数字,而主键值一旦突破了上限就会报异常了。不过,看了这个上限,好大好大的数。。。。。。所以我也就没再担心了~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180928G1WEB300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券