发新话题
打印

mysql LAST_Insert_ID()函数,防止mysql重启 innodb 表AUTO_INCREMENT字段恢复

mysql LAST_Insert_ID()函数,防止mysql重启 innodb 表AUTO_INCREMENT字段恢复

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复制,而没有重启备份机器的话,就会导致备份机器出现主键重复的问题,而导致备份机器停止工作
(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列恢复的数据的问题。

TOP

发新话题