ホームページ >データベース >mysql チュートリアル >MySQL の自動インクリメントは、一意の制約がある場合に挿入が失敗してもインクリメントされるのはなぜですか?

MySQL の自動インクリメントは、一意の制約がある場合に挿入が失敗してもインクリメントされるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-25 12:16:15130ブラウズ

Why Does MySQL's Autoincrement Increment Even on Failed Inserts with Unique Constraints?

挿入失敗時の MySQL 自動インクリメント動作

質問:

自動インクリメントが行われるのはなぜですか一意のフィールドの場合、挿入が失敗したにもかかわらず、MySQL の値が増加する存在しますか?

説明:

MySQL のデフォルト エンジンである InnoDB はトランザクション的に動作します。したがって、複数のセッションが自動インクリメント列を含むテーブルに同時に挿入しようとすると、特定のシナリオが発生する可能性があります。

  • セッション A がレコードを挿入し、その後ロールバックした場合、ギャップが発生するか、セッション B が発生する可能性があります。同時にレコードを挿入しようとしましたが、セッション A のトランザクションが完了するまでロックされる可能性があります。
  • このようなテーブルへの挿入の同時実行性を強化するには、InnoDB特別なテーブルレベルの AUTO-INC ロックを利用します。このロックはトランザクションではなく SQL ステートメントの最後に解放されるため、他のセッションがより効率的に自動インクリメント カウンタにアクセスできるようになります。

結果:

一意のフィールド制約違反により挿入が失敗した場合でも、InnoDB がメモリ内の自動インクリメント カウンターを維持するため、自動インクリメント値はインクリメントされます。サーバーの運用全体を通じて。サーバーが再起動すると、InnoDB はテーブルへの最初の挿入中に各テーブルのカウンターをリセットします。

軽減策:

ID 列のラップの可能性が懸念される場合、より広い範囲の値を提供するには、BIGINT データ型 (8 バイト長) の使用を検討してください。

以上がMySQL の自動インクリメントは、一意の制約がある場合に挿入が失敗してもインクリメントされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。