5.1手册说明:如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。自动增长计数器仅被存储在主内存中,而不是存在磁盘上,重启mysql后,增长计数器将被重置;
CREATE TABLE `seq_table` (
`id` int(10) unsigned NOT NULL
) ENGINE=InnoDB ;
CREATE TABLE `seq_tab` (
`uid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`username` char(15) NOT NULL DEFAULT '',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB ;
(1)未用LAST_Insert_ID()函数
insert into seq_tab(uid,Username) values (null,'test');
insert into seq_tab(uid,Username) values (null,'yangting');
select * from seq_tab;
+-----+----------+
| uid | username |
+-----+----------+
| 1 | test |
| 2 | yangting |
delete from seq_tab ;
select * from seq_tab; 是空的
insert into seq_tab(uid,Username) values (null,'ting');
insert into seq_tab(uid,Username) values (null,'yang');
select * from seq_tab;
+-----+----------+
| uid | username |
+-----+----------+
| 3 | ting |
| 4 | yang |
delete from seq_tab ;
select * from seq_tab; 是空的
重启mysql后,增长计数器将被重置,
如果再插入
insert into seq_tab(uid,Username) values (null,'test');
insert into seq_tab(uid,Username) values (null,'yangting');
他将是,
select * from seq_tab;
+-----+----------+
| uid | username |
+-----+----------+
| 1 | test |
| 2 | yangting |
而不是我想要的
+-----+----------+
| uid | username |
+-----+----------+
| 5 | test |
| 6| yangting |
这样的话,如我们做了AB复制,而没有重启备份机器的话,就会导致备份机器出现主键重复的问题,而导致备份机器停止工作(在5.148中测试发现,这句话是错误的。向大家抱歉下,AUTO_INCREMENT是能很好的复制的,只要不是在 a stored routine or trigger 中使用)
(2)使用LAST_Insert_ID()函数
创建一个专门用来生成AUTO_INCREMENT序列的数据表,并做到永远不去删除该表的记录。
insert into seq_table values (0);
update seq_table set id = LAST_Insert_ID( id + 1 );
insert into seq_tab(uid,Username) values (LAST_Insert_ID(),'test');
select * from seq_tab;
+-----+----------+
| uid | username |
+-----+----------+
| 1 | test |
删除 seq_tab表的数据后再重启数据库,
往seq_tab表插入数据
update seq_table set id = LAST_Insert_ID( id + 1 );
insert into seq_tab(uid,Username) values (LAST_Insert_ID(),'yangting');
就是我想要的
select * from seq_tab;
+-----+----------+
| uid | username |
+-----+----------+
| 2 | yangting |
这样就有效的防止重启后AUTO_INCREMENT列恢复的数据的问题。