InnoDB的"auto_increment"指定值被重置问题
2010-04-02 16:57
232 查看
有时候新建的表需要对自增列指定初始值,但是有时候会出现明明指定过的初始值却被重置的现象。下面以一个小实验来说明这个问题:
MySQL version:5.1.42 OS:redhat5.3
无废话,建张表先:
代码CREATE TABLE `sbtest1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`k` int(10) unsigned NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=20000000 DEFAULT CHARSET=latin1
mysql> quit
Bye
[root@test_2 ~]# service mysqld restart
mysql> show create table sbtest1 \G
*************************** 1. row ***************************
Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`k` int(10) unsigned NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
这时,auto_increment的值被重置了!
通过以上的小实验,结合手册就能理解为什么会发生这种现象了:
如果对某张innodb表指定了auto_increment,那么innodb就会在data dictionary为它维护一个auto_increment计数器,注意:这个计数器只存储在内存中,不会写在disk上。
那么 innodb在DB重启后,如何对这个计数器进行初始化呢(结合实验中的这张表来说明)?
InnoDB在数据库重新启动后,它会对指定过 auto_increment的表(sbtest1)做这样一个操作:
SELECT MAX(id) FROM sbtest1 FOR UPDATE;然后将这条语句取得的值+1赋给被指定auto_increment的字段和在内存中的这张表的计数器。如果表是空的,那么这个值将会是1.
解决方法:
1.重建完表后,插入数据之前不要重启(说白了,就是要保证内存的数据不会释放)
2.插入一条脏数据
MySQL version:5.1.42 OS:redhat5.3
无废话,建张表先:
代码CREATE TABLE `sbtest1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`k` int(10) unsigned NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=20000000 DEFAULT CHARSET=latin1
mysql> quit
Bye
[root@test_2 ~]# service mysqld restart
mysql> show create table sbtest1 \G
*************************** 1. row ***************************
Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`k` int(10) unsigned NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
这时,auto_increment的值被重置了!
通过以上的小实验,结合手册就能理解为什么会发生这种现象了:
如果对某张innodb表指定了auto_increment,那么innodb就会在data dictionary为它维护一个auto_increment计数器,注意:这个计数器只存储在内存中,不会写在disk上。
那么 innodb在DB重启后,如何对这个计数器进行初始化呢(结合实验中的这张表来说明)?
InnoDB在数据库重新启动后,它会对指定过 auto_increment的表(sbtest1)做这样一个操作:
SELECT MAX(id) FROM sbtest1 FOR UPDATE;然后将这条语句取得的值+1赋给被指定auto_increment的字段和在内存中的这张表的计数器。如果表是空的,那么这个值将会是1.
解决方法:
1.重建完表后,插入数据之前不要重启(说白了,就是要保证内存的数据不会释放)
2.插入一条脏数据
相关文章推荐
- mysql中的auto_increment的问题(MyISAM,InnoDB)
- "ora-12154 无法解析指定的连接标识符"问题的解决
- 解决问题:vs 使用命令行参数调试时出现"当前项目设置指定将使用特定的安全权限对该项目进行调试.在此模式下,命令行参数将不会传递给可执行文件."
- Vc++遇到的问题(error LNK2001问题和"系统无法执行指定的程序"问题)
- 重启mysql,auto_increment的值重置(InnoDB)
- mysql innodb auto_increment id不连续增长问题
- Innodb的表锁问题_auto_increment
- 评playerc网友的"求比指定数大且最小的“不重复数”问题"
- "ox69a8674c"指定应用的"0x00000000"内存不能为"read"问题
- "调用的目标发生了异常。"问题处理
- "is not on any development teams " Xcode的账号错误问题
- 解决Sony Z2上卸载 "授权管理" 带来的发热问题
- 解决 "Use a cube template" is dimmed (disabled) "使用立方模板" 选项不可选(变灰)(被禁用)的问题
- 【jQuery 区别】.click()和$(document).on("click","指定的元素",function(){});的区别
- HDU - 2065 "红色病毒"问题 (指数型母函数+泰勒级数)
- Sql Server 2008 出现"provider:命名管道提供程序,error:40"问题,无法登录数据库
- 记录解决eclipse的"Resource specification not allowed here for source level below 1.7"问题
- windows7上安装scala出现"此时不应有 \scala\bin\scala.bat"问题解决方案
- 关于数据库写入慢的问题autocommit,索引等对Innodb写入速度的影响
- hdu 2065 "红色病毒"问题