問題:
INSERT ... ON DUPLICATE KEY を使用する場合自動インクリメント列 (id) を含むテーブルを含む UPDATE ステートメントでは、id 値は次のように表示されます。重複キーが見つかった場合、奇数に増加します。最初の挿入中 (重複キーなし)、ID は通常どおり増加します。ただし、ON DUPLICATE KEY 句がトリガーされ、新しい行が挿入されると、ID 値が不整合になります。
回答:
この動作は意図的なものであり、MySQL によって文書化されています。 。一意のインデックスまたは主キーに重複値を引き起こすローが挿入されると、MySQL は新しいローを挿入する代わりに古いローの更新を実行します。これは、INSERT ステートメントが最初に試行されても、その段階で ID 値がすでにインクリメントされていることを意味します。
自動インクリメント列は UPDATE ステートメントによって更新されないため、その後の更新では ID 値はインクリメントされません。 。代わりに、元の (更新された) 行の ID 値が保持されます。
解決策:
ギャップのない自動インクリメントを維持するには、別の行を使用する必要があります。アプローチ。 1 つのオプションは、自動インクリメント列に依存するのではなく、出力で増分値を計算することです。あるいは、テーブルのロックとトリガーを含むより複雑なアプローチを使用して、行の番号を付け直し、ID 値にギャップがないようにすることもできます。
以上がMySQL の AUTO_INCREMENT が INSERT ... ON DUPLICATE KEY UPDATE と矛盾する動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。