自定义AUTO INCREMENT值无效

时间:2018-04-27 17:57:21

标签: mysql sql database

我有以下sql代码来创建表

CREATE TABLE db.object (
  `objid` bigint(20) NOT NULL AUTO_INCREMENT,
  `object_type` varchar(32) NOT NULL,
  PRIMARY KEY (`objid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

但是,objid中的值是1,2,3 ...(插入语句不添加id)

不应该AUTO_INCREMENT=2从2而不是1开始使用objid

3 个答案:

答案 0 :(得分:2)

对于InnoDB表,当打开表时,AUTO_INCREMENT值将重置为最大值(加1)。自动增量值仅存在于内存中,不会保留在磁盘上。

表会打开,例如,当MySQL实例关闭然后重新启动时,会引用该表。

也可以在其他时间关闭表格。例如,当超过open_table_cache时(即,当打开大量其他表时),MySQL将关闭一些打开的表,以便在缓存中为新打开的表腾出空间。

我相信这种行为在MySQL参考手册的某处记录。

答案 1 :(得分:1)

我使用了你的SQL,创建了对象表并为object_typeobjid输入了两个值,从2开始。在这里看不出任何错误...

enter image description here

答案 2 :(得分:1)

可能。在InnoDB表上有足够的例外和关于auto-inc的问题,它要求full review of the documentation

也就是说,有一种情况我可以想到MySQL忽略初始化值的地方。我引用文档:

  

只要服务器运行,InnoDB就会使用内存中的自动增量计数器。当服务器停止并重新启动时,InnoDB重新初始化表的第一个INSERT的每个表的计数器,如[here]所述:

     
    

InnoDB在重启后第一次插入到包含AUTO_INCREMENT列的表中执行以下语句的等效语句:

         

SELECT MAX(ai_col) FROM table_name FOR UPDATE;

  
     

服务器重启还会取消CREATE TABLE和ALTER TABLE语句中AUTO_INCREMENT = N表选项的影响,您可以将其与InnoDB表一起使用来设置初始计数器值或更改当前计数器值。

因此,如果您创建该表,然后重新启动服务器(就像部署过程的一部分一样),您将为初始行获得一个很好的1值。如果你想反击这个,你需要创建表,然后插入一个带有你想要的auto-inc值的虚拟行,然后重启,然后删除虚拟行