ゆっくりと情報を収集する作業テーブルがあります。たとえば、テーブル A1、A2、A3 とします。
時々、テーブル A1、A2、A3 からテーブル B1、B2、B3 に新しい情報をコピーする必要があります。テーブルはかなり大きい (~20000 行)。
A1、A2、A3 テーブルは GUID を使用し、B1、B2、B3 テーブルには AUTO_INCREMENT ID があります。
サイズが大きいため、挿入は 300 単位で行われます。
挿入の 1 つが失敗した場合、他のすべてのテーブルにもデータが挿入されてはならないので、すべてのクエリをトランザクションに入れます。
この記事に記載されているソリューションは機能しているようです: 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 がすぐにサイズ制限に達します
私はこれで数週間苦労してきましたが、ギャップがこれほど速く増加しない限り、ギャップは気にしません。この問題に取り組むための最良の方法について誰か提案がありますか?