2

我有一个可以慢慢收集信息的工作表,比如说表 A1、A2、A3。

有时我需要将表 A1、A2、A3 中的新信息复制到表 B1、B2、B3 中。这些表相当大(约 20000 行)。

A1、A2、A3 表使用 GUID,而 B1、B2、B3 表使用 AUTO_INCREMENT id。

由于尺寸的原因,插入的数量为 300 个。

如果其中一个插入失败,则所有其他表也不能插入数据,因此我将所有查询放入事务中。

本文中提到的解决方案似乎有效:http: //mysql.rjweb.org/doc.php/datawarehouse

除了文章特别提到这不应该在事务中完成(据我所知,这是我做不到的)

此 INSERT..SELECT 不得在事务中与其余处理一起完成。否则,您会增加死锁风险,导致 id 被烧毁。

我还考虑过使用 INSERT IGNORE 和 innodb_autoinc_lock_mode=0 但我无法使用 PDO 设置 innodb_autoinc_lock_mode,它只是给出了错误:

SQLSTATE [HY000]:一般错误:1238 变量“innodb_autoinc_lock_mode”是只读变量“

弄清楚如何使用 PDO 设置 innodb_autoinc_lock_mode 可以解决这个问题,但我无法做到。

只是做INSERT IGNORE INTO B1 SELECT FROM A1而忽略差距听起来也很诱人,但是表太大了,autoinc id 很快就达到了大小限制

我已经为此苦苦挣扎了几个星期,只要它们不增长得这么快,我不介意差距。有没有人建议解决这个问题的最佳方法?

4

1 回答 1

2

但表太大,autoinc id 很快达到大小限制

它不是。

如果每秒插入一条新记录,70 年后将达到极限。甚至可以扩展此限制,但怀疑是否需要这样做。

所以,不要介意间隙并以通常的方式插入。

而且 - 更多的是 - 永远不要为自动增量而烦恼。这不是必须保持井井有条的东西。

于 2013-10-27T15:07:08.500 回答