我在我的开发机器上运行MySQL 5.5.37。 我用innodb表。面临下一个问题 - 服务器重启后自动增量重置。
找到autoinc_lock_mode,设置为0,但没有帮助。
SHOW VARIABLES
命令显示autoinc_lock_mode的值为0。
我的所作所为:
select max(id) from tablex; // 11, autoincrement is 12
insert into tablex values ('foo');
select max(id) from tablex; // 12, autoincrement is 13
delete from tablex where id > 11; // autoincrement is 13
然后我重启服务器......和....(鼓声)
show create table tablex; // autoincrement 12 instead of 13
我做错了什么? :(
// UPD
我必须使用MyISAM表。谢谢大家的回复/评论。
答案 0 :(得分:9)
在InnoDB中,自动增量值不是表格元数据的一部分,并在每次重启服务器时重置。
InnoDB使用以下算法初始化自动增量 包含名为
AUTO_INCREMENT
列的表t的计数器ai_col
:服务器启动后,第一次插入表t
, InnoDB执行此语句的等价物:
SELECT MAX(ai_col) FROM t FOR UPDATE
InnoDB递增值 由语句检索并将其分配给列和 表的自动递增计数器。默认情况下,该值为 增加1。此默认值可以被覆盖
auto_increment_increment
配置设置。如果表为空,InnoDB使用值1.默认值为 被auto_increment_offset配置设置覆盖。
在服务器可执行生命周期中,它存储在一个特殊的结构中,但不会在服务器重新启动之间保留:
如果为InnoDB表指定AUTO_INCREMENT列,则为表 InnoDB数据字典中的句柄包含一个名为的特殊计数器 用于为其分配新值的自动递增计数器 专栏。此计数器仅存储在主存储器中,而不存储在磁盘上。
您设置的变量定义了不同会话同时访问此结构的方式,而不是其生命周期。
如果要在服务器重新启动之间保持自动增量值,则应在每次写入时将其保存在不受事务控制(如MyISAM
或Archive
)的表中并重置它从服务器重启表中。