如何确定MySQL auto_increment步长

时间:2011-11-24 21:59:44

标签: mysql auto-increment

我有一个网页表,主键是URL的哈希值,还有一个auto_increment ID列,它也是一个唯一键。

我有点困惑的是为什么连续插入不会将ID字段增加1.当我第一次创建表并执行单个插入时,第一个id为1.第二个插入生成和id 5,第三个是8。

我在表上有一个触发器,在插入时,计算网页URL的哈希值。不确定这是否相关。

有间隙不是问题,但我想了解为什么连续插入不会生成步长为1的ID。

谢谢!

5 个答案:

答案 0 :(得分:8)

为什么会出现这种情况的几点建议:

auto_increment_increment。每次在INSERT期间请求新值时,它都会控制增量。

此外,如果您在MySQL 5.1中使用InnoDB表,它们optimized auto-inc allocation以便它将表锁定的持续时间更短。这对于并发性很有用,但如果行的INSERT与另一个约束(例如辅助UNIQUE列或外键)冲突,它也会“丢失”auto-inc值。在这些情况下,分配的auto-inc值不会被推回到队列中,因为我们假设另一个并发线程可能已经分配了下一个auto-inc值。

当然也会发生回滚,在这种情况下,可以分配auto-inc值但丢弃。

答案 1 :(得分:3)

它可能与最终被回滚的交易有关。例如,

  1. 插入google.com id = 5
  2. 插入mysql.com id = 6
  3. 插入stackoverflow.com id = 7
  4. rollback insert google.com
  5. rollback insert mysql.com
  6. 然后插入stackoverflow.com,其中id = 7,并且5和6保留为空白。

答案 2 :(得分:1)

自动增量的步长始终为1,但一旦删除一行,ID就不会被释放。

下一个自动增量ID存储在MySQL环境中的信息架构数据库中。它总是+1,当一行被删除时,其间的ID将丢失。因此,如果第一个是1,而第二个(根据你)是5,那么在此过程中已经删除了2,3,4。

运行此查询以查找并替换where;)

中的最后2个值
SELECT AUTO_INCREMENT
from `information_schema`.`TABLES`
WHERE   TABLE_NAME = '<<YOUR TABLE NAME HERE>>' AND
      TABLE_SCHEMA = '<< YOUR DATABASE NAME HERE >>'

答案 3 :(得分:1)

mysql.cnf / ini可以设置更改:

auto-increment-increment = 2
auto-increment-offset = 1

在某些配置中(例如,对于主/主复制),a_i可以使用这些变量跳过数字。

答案 4 :(得分:0)

SET GLOBAL auto_increment_offset = 1;

SET GLOBAL auto_increment_increment = 5;

auto_increment_offset:连续列值之间的间隔 auto_increment_offset:确定AUTO_INCREMENT列值的起点。 默认值为1。

more info here