1

我有一个以自动增量 col 作为键的表的查询selectinsert行。

insert into table a select * from table B

发现执行查询后,在自增列中出现了sequence gaptable B

有可能吗?或者我的选择语句未能插入一些记录??

请帮忙。

我无法重现这种情况,因为这是一个生产服务器,并且在执行查询之前我没有备份。

非常感谢。

4

1 回答 1

2

如果您使用InnoDBwith INSERT IGNORE,您可能需要阅读这篇讨论此问题的文章:

使用 INSERT IGNORE 避免 InnoDB 上的自动增量漏洞

为什么我们会有差距?

InnoDB 检查表上的 auto_increment 计数器,如果需要新值,则递增该计数器并将新值分配给列。在 MySQL 5.1.22 之前,InnoDB 使用一种称为“Traditional”的方法来访问该计数器值。这个使用一种称为 AUTO-INC 的特殊表锁,它一直保持到查询或事务结束。正因为如此,两个查询不能同时拥有 AUTO-INC 锁,所以我们失去了并发性和性能。对于像 INSERT INTO table1 ... SELECT ... FROM table2 这样的长时间运行的查询,问题会更加严重。

当使用 select 的简单插入时,有一个已知的错误

总之,我不会说这是您的查询的问题,而是与引擎处理来自选择块的插入的方式有关。

于 2013-08-08T16:20:37.973 回答