Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4842557
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: Mysql/postgreSQL

2010-07-22 17:09:11

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

阅读(1769) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~