Mir*_*age 4 mysql innodb auto-increment
我在我的开发机器上运行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
Run Code Online (Sandbox Code Playgroud)
然后我重新启动服务器......和....(鼓滚)
show create table tablex; // autoincrement 12 instead of 13
Run Code Online (Sandbox Code Playgroud)
我做错了什么?:(
// UPD
我必须使用MyISAM表.谢谢大家的回复/评论.
Qua*_*noi 10
在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
)的表中,并在服务器重新启动时从表中重置它.