0

我正在尝试将包含数十亿行的表移动到 MySQL 5.6 中的新目录。我正在尝试通过删除 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 列中不包含任何间隙。

4

2 回答 2

1

问谷歌:https ://www.google.com/search?q=auto_increment+mysql+gaps+innodb 第一个结果说明了这个问题。

通常,您需要能够告诉 SO 人您迄今为止尝试过什么以及为什么它不起作用。在这种情况下,这只是 InnoDB 引擎的一个特性/特性,可以让它在大容量下快速运行。

于 2013-11-07T19:07:40.720 回答
0

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

于 2013-11-07T19:11:31.010 回答