スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL 8.0 の AUTO_INCREMENT について

MySQL 8.0 では InnoDB関連が強化されていますが、ここでは AUTO_INCREMENT に対象を絞って検証してみたいと思います。

MySQL :: MySQL 8.0 Reference Manual :: 1.4 What Is New in MySQL 8.0

MySQL 8.0 からは AUTO_INCREMENT のカウンター値はREDOログに書き込まれるように変更になりました。
そのため、いくつかの挙動でMySQL 5.7と異なる動きをします。

サーバーを再起動しても AUTO_INCREMENT の値がリセットされなくなりました。

MySQL 5.7 まで存在していたテーブル定義の AUTO_INCREMENT の値がサーバーの再起動でリセットされてしまうバグが解消されました。

検証

MySQL 5.7とMySQL 8.0 で 0 件のテーブルで AUTO_INCREMENT の値だけ1000に変更します。

MySQL Sandbox 環境の MySQLを再起動します。

MySQL 5.7 の場合 AUTO_INCREMENT の値がリセットされて 1 が挿入されました。

MySQL 8.0 の場合、再起動後も AUTO_INCREMENT の値が保持され、1000 が挿入されました。

このバグ(仕様?)は、2003年5月に MySQL bugs に起票されてからMySQL 5.7 に至るまでずっとそのままだったものが、ついに MySQL 8.0 で解消されることになりました。

AUTO_INCREMENT の最大値より大きい値で更新した場合

AUTO_INCREMENT カラムの値を AUTO_INCREMENT の最大値より大きい値で変更した場合の挙動も MySQL 5.7 と MySQL 8.0 で異なるようになりました。

検証

MySQL 5.7、MySQL 8.0 で以下のテーブル作成します。

以下のように数件のレコードを作成します。

AUTO_INCREMENT の最大値より大きい値で更新します。

MySQL 8.0 の場合

AUTO_INCREMENT が 11 に更新されていることがわかります。

そのため、次にデータを挿入すると 11 が入ります。

MySQL 5.7 の場合

AUTO_INCREMENT は 4 のままです。

そのため、次に挿入すると 4 が入ります。

まとめ

MySQL5.7とMySQL8.0ではいくつかのケースで AUTO_INCREMENT の挙動が変わっていることがわかりました。
アプリケーション側がこういった AUTO_INCREMENT の挙動を期待して実装している場合、思わぬ不具合が発生する可能性があるためアップグレード前に十分な検証を行うなどの注意が必要です。

Return Top