我有一个可以慢慢收集信息的工作表,比如说表 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 很快就达到了大小限制
我已经为此苦苦挣扎了几个星期,只要它们不增长得这么快,我不介意差距。有没有人建议解决这个问题的最佳方法?