日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

InnoDB的auto_increment指定值被重置问题

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

那什么時候?嗯,確切地說是做什么樣的操作,重置現象才會出現呢?看實驗:

代碼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.插入一條臟數據?

?

?

?

轉載于:https://www.cnblogs.com/minglog/archive/2010/04/02/1703278.html

總結

以上是生活随笔為你收集整理的InnoDB的auto_increment指定值被重置问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。