医疗网站建设比较好的,Wordpress手游模版,淘宝客app开发,上海外贸公司招聘职位有时候新建的表需要对自增列指定初始值#xff0c;但是有时候会出现明明指定过的初始值却被重置的现象。下面以一个小实验来说明这个问题#xff1a;MySQL version:5.1.42 OS:redhat5.3无废话#xff0c;建张表先#xff1a;代码CREATETABLEsbtest1 ( id int(10) unsigned…有时候新建的表需要对自增列指定初始值但是有时候会出现明明指定过的初始值却被重置的现象。下面以一个小实验来说明这个问题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)) ENGINEInnoDB AUTO_INCREMENT20000000 DEFAULT CHARSETlatin1;诸位看官可以看见我指定了auto_increment20000000。表建好后如果紧接着插数据那么此现象是不会出现的:代码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)) ENGINEInnoDB AUTO_INCREMENT20000000 DEFAULT CHARSETlatin1 mysql quitBye[roottest_2 ~]# service mysqld restartmysql show create table sbtest1 \G*************************** 1. row *************************** Table: sbtest1Create 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)) ENGINEInnoDB DEFAULT CHARSETlatin11 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