自动递增5个号码?

时间:2014-11-21 16:55:29

标签: php database

我正在使用数据库进行我插入的项目,并且我有一个自动增量。但是,随机地,自动增量ID开始计数错误。

例如,表中的最后一个ID为227.当我插入另一行时,它应自动将其指定为228,而是跳转到232.如何解决此问题?

2 个答案:

答案 0 :(得分:5)

自动增量并不意味着使用表格中的下一个最高数字。

自动递增编号不连续的原因有几个。

  1. 自动增量步骤可能不是1
  2. 之前的行可能已被删除
  3. 插入表格的交易可能已经回滚
  4. 记录可能已更新自动增量列
  5. 自动增量开始索引可能已通过DDL修改而更改。
  6. 然而,可能会有一些其他情况会导致这种情况。

    要回答“我该如何解决这个问题?”的问题,请不要理会,ID应该是唯一的,没有别的,ID连续的通常没那么有用(除非你做分页假设它们是连续的,这是一个不好的假设。

答案 1 :(得分:0)

数据库服务器可以提前收集自动增量编号。数据库有时会得到5(或10或100)并更新下一个数字的长期存储,而不是只获得所要求的数据,而下一个数字将分配给下一个+ 5(或10或100)。然后在下一次分配下一个时,它会在内存中获得更快的速度,特别是因为它不必存储分配给磁盘的下一个。

时间表:

  • 被问到下一个号码
  • 内存中没有一个如此:
    • 转到磁盘以获取下一个(称之为)
    • 使用+ 100
    • 更新磁盘
    • 给提问者
    • 在内存中存储+ 1作为下一个
  • 被问到下一个号码
  • 给它一个+ 1并在内存中存储+ 2

......等等。

但是,如果数据库服务器在发出所有数字之前停止,那么当它重新启动时,它将查找下一个数字并找到+ 100 - 因此存在差距。通常保证自动编号作为不断增加的值给出,并且应始终是唯一的(观察当达到最大值时会发生什么)。它们通常但不总是顺序的。

(Oracle对Sequences做了同样的事情。自从我使用它以来已经有一段时间了,但是使用序列可以指定缓存大小。保证顺序分配的唯一方法是将缓存大小设置为零,这样会更慢。 )