InnoDB的auto_increment指定值被重置问题
有時候新建的表需要對自增列指定初始值,但是有時候會出現明明指定過的初始值卻被重置的現象。下面以一個小實驗來說明這個問題:
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;
諸位看官可以看見我指定了auto_increment=20000000。
表建好后,如果緊接著插數據,那么此現象是不會出現的:
代碼mysql>?insert?into?sbtest1(k,pad)?values(123,'what?are?you?doing');Query?OK,?1?row?affected?(0.00?sec)
mysql>?select?*?from?sbtest1;
+----------+-----+---+--------------------+
|?id???????|?k???|?c?|?pad????????????????|
+----------+-----+---+--------------------+
|?20000000?|?123?|???|?what?are?you?doing?|
+----------+-----+---+--------------------+
1?row?in?set?(0.00?sec)
那什么時候?嗯,確切地說是做什么樣的操作,重置現象才會出現呢?看實驗:
??`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)做這樣一個操作:
然后將這條語句取得的值+1賦給被指定auto_increment的字段和在內存中的這張表的計數器。如果表是空的,那么這個值將會是1.
解決方法:
1.重建完表后,插入數據之前不要重啟(說白了,就是要保證內存的數據不會釋放)
2.插入一條臟數據?
?
?
?
轉載于:https://www.cnblogs.com/minglog/archive/2010/04/02/1703278.html
總結
以上是生活随笔為你收集整理的InnoDB的auto_increment指定值被重置问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库表的字段中含空格怎么办?
- 下一篇: SqlServer2008 安装经验日志