我的开发机器上运行的是 MySQL 5.5.37。
我使用 innodb 表。面临下一个问题 - 服务器重新启动后自动增量重置。
Found 自动锁模式 http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_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 表。谢谢大家的回复/评论。
在 InnoDB 中,自动增量值不是表元数据的一部分,并且会在每次服务器重新启动时重置。
InnoDB使用以下算法来初始化自增
表 t 的计数器包含AUTO_INCREMENT
列名为ai_col
:服务器启动后,第一次插入表t
,
InnoDB 执行与此语句等效的操作:
SELECT MAX(ai_col) FROM t FOR UPDATE
; InnoDB 增加值
由语句检索并将其分配给列和
表的自动增量计数器。默认情况下,该值为
加一。该默认值可以被覆盖auto_increment_increment
配置设置。
如果表为空,InnoDB 使用值 1。此默认值可以是
由 auto_increment_offset 配置设置覆盖。
在服务器可执行文件的生命周期中,它存储在特殊的结构中,但在服务器重新启动之间不会保留:
如果为 InnoDB 表指定 AUTO_INCREMENT 列,则该表
InnoDB数据字典中的句柄包含一个特殊的计数器,称为
用于分配新值的自动递增计数器
专栏。该计数器仅存储在主存储器中,而不存储在磁盘上。
您设置的变量定义了不同会话同时访问此结构的方式,而不是其生命周期。
如果您想在服务器重新启动之间保留自动增量值,您应该将其保存在不受事务控制的表中(例如MyISAM
or Archive
)在每次写入时并在服务器重新启动时从表中重置它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)