我有一个以自动增量 col 作为键的表的查询select
和insert
行。
insert into table a select * from table B
发现执行查询后,在自增列中出现了sequence gaptable B
有可能吗?或者我的选择语句未能插入一些记录??
请帮忙。
我无法重现这种情况,因为这是一个生产服务器,并且在执行查询之前我没有备份。
非常感谢。
我有一个以自动增量 col 作为键的表的查询select
和insert
行。
insert into table a select * from table B
发现执行查询后,在自增列中出现了sequence gaptable B
有可能吗?或者我的选择语句未能插入一些记录??
请帮忙。
我无法重现这种情况,因为这是一个生产服务器,并且在执行查询之前我没有备份。
非常感谢。
如果您使用InnoDB
with 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 的简单插入时,有一个已知的错误
总之,我不会说这是您的查询的问题,而是与引擎处理来自选择块的插入的方式有关。