我正在尝试将包含数十亿行的表移动到MySQL 5.6中的一个新目录。我试图通过删除Table1然后将Table1然后将Table2重命名为Table1将Table1复制到Table2。

    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)。 Table1没有在ID列中包含任何空白。

有帮助吗?

解决方案

询问Google: https://www.google.com/search?q=Auto_increment+Mysql+Gaps+Innodb第一个结果 解释了这个问题。

通常,您需要能够告诉人们您到目前为止尝试过的事情以及为什么它不起作用。在这种情况下,这只是InnoDB发动机的功能/特征,它可以使其在大量量中快速运行。

其他提示

自动增量字段不能保证是密集的,它们只是保证为您提供独特的价值。 通常 它可以通过给您致密(连续)值来做到这一点,但不必这样做。它将保留许多值,如果不使用,可以丢弃。看 http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top