我有以下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
答案 0 :(得分:2)
对于InnoDB表,当打开表时,AUTO_INCREMENT
值将重置为最大值(加1)。自动增量值仅存在于内存中,不会保留在磁盘上。
表会打开,例如,当MySQL实例关闭然后重新启动时,会引用该表。
也可以在其他时间关闭表格。例如,当超过open_table_cache
时(即,当打开大量其他表时),MySQL将关闭一些打开的表,以便在缓存中为新打开的表腾出空间。
我相信这种行为在MySQL参考手册的某处记录。
答案 1 :(得分:1)
答案 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值的虚拟行,然后重启,然后删除虚拟行