我有一个网页表,主键是URL的哈希值,还有一个auto_increment ID列,它也是一个唯一键。
我有点困惑的是为什么连续插入不会将ID字段增加1.当我第一次创建表并执行单个插入时,第一个id为1.第二个插入生成和id 5,第三个是8。
我在表上有一个触发器,在插入时,计算网页URL的哈希值。不确定这是否相关。
有间隙不是问题,但我想了解为什么连续插入不会生成步长为1的ID。
谢谢!
答案 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)
它可能与最终被回滚的交易有关。例如,
然后插入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。