MySQL では、一意の値の重複により挿入操作が失敗した場合、一意の制約と組み合わされた auto_increment フィールドを持つテーブルが特有の動作を示します。 。挿入は意図したとおりに失敗しますが、それでも auto_increment 値はインクリメントされます。これは、自動インクリメント カウンターへのアクセスによって引き起こされる現象です。
この動作の中核には、InnoDB のトランザクションの性質があります。挿入の同時実行性を確保するために、InnoDB は特別なテーブル レベルの AUTO-INC ロックを利用します。このロックは、トランザクションの終了ではなく、現在の SQL ステートメントの終了までロックされたままになります。
これは、たとえ挿入が失敗したとしても一意の値が重複しているため、ステートメントの完了時に LOCK が解放されるため、自動インクリメント カウンタがインクリメントされます。後続の挿入ではインクリメントされた値が取得され、自動インクリメント シーケンスにギャップが生じます。
ギャップを許可するという InnoDB の決定は、auto_increment 列を持つテーブルへの挿入の同時実行性を強化することを目的としています。ただし、自動インクリメント ID 列が最大値をラップする場合、テーブルが破損する可能性があるという懸念が生じます。
このリスクを軽減するには、ID 列に BIGINT データ型を使用することを検討してください。バイトのストレージ容量が向上し、ラップアラウンド問題の可能性が大幅に減少します。
以上がMySQL の自動インクリメントは挿入が失敗してもインクリメントされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。