文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>利用LAST_Insert_ID()函数,防止mysql重启 innod..

利用LAST_Insert_ID()函数,防止mysql重启 innod..

时间:2010-07-22  来源:ubuntuer

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列恢复的数据的问题。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载