我正在尝试将包含数十亿行的表移动到MySQL 5.6中的新目录中。我试图将table1复制到table2,然后通过删除table1然后将table2重命名为table1。
CREATE TABLE `table2` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`col1` int(11) DEFAULT NULL,
`col2` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_col1_col2` (`col1`,`col2`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 DATA DIRECTORY='/mysql_data/';
我使用以下程序进行复制。
DROP PROCEDURE IF EXISTS copytables;
CREATE PROCEDURE `copytables`()
begin
DECLARE v_id INT(11) unsigned default 0;
declare maxid int(11) unsigned default 0;
select max(id) into maxid from table1;
while v_id < maxid do
insert into table2(col1,col2)
select fbpost_id,fbuser_id from table1 where id >= v_id and id <v_id+100000 ;
set v_id=v_id+100000;
select v_id;
select max(id) into maxid from table1;
select maxid;
end while;
end;
但是现在我在table2中的每批100000之后得到了id列的空白(在id 199999下一个id为262141之后)。表1不包含id列中的任何间隙。
答案 0 :(得分:1)
询问Google:https://www.google.com/search?q=auto_increment+mysql+gaps+innodb first result解释了此问题。
通常,您需要能够告诉SO人们到目前为止您尝试了什么,以及为什么它不起作用。在这种情况下,这只是InnoDB引擎的一个特性/特性,可以让它以高容量快速运行。
答案 1 :(得分:0)
自动增量字段不保证密集,它们只能保证为您提供唯一值。 通常它会通过为您提供密集(连续)值来实现,但它并不是必须的。它将保留许多值,如果不使用则可以丢弃。见http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html