MySQLでAUTO_INCREMENT列のID断片化(欠番)を処理する方法
MySQLにおける自動インクリメントIDの断片化とは
データベースで連番を管理する際、一意なIDの採番に関して問題が発生することがあります。特に、行を削除したりサーバーを再起動したりすると、AUTO_INCREMENTの値に「欠番(断片化)」が生じる場合があります。
MySQL 5.6のInnoDBでは、INSERT文にID列を明示的に含めることで、自動採番のIDを再利用(任意の値を指定)することが可能です。
IDに断片化(欠番)が発生する主なケース
- 最大の番号を持つIDを削除した場合
- MySQLサーバーを起動・停止した場合
- 新しいレコードを挿入した場合
実際の動作を確認する例
まず、auto_increment属性を使ってIDを自動採番するテーブルを作成します。
mysql> create table UniqueAutoId
-> (
-> id int auto_increment,
-> Unique(id)
-> );
Query OK, 0 rows affected (0.45 sec)
次に、テーブルにレコードを5件挿入します。
mysql> insert into UniqueAutoId values();
Query OK, 1 row affected (0.13 sec)
mysql> insert into UniqueAutoId values();
Query OK, 1 row affected (0.16 sec)
mysql> insert into UniqueAutoId values();
Query OK, 1 row affected (0.07 sec)
mysql> insert into UniqueAutoId values();
Query OK, 1 row affected (0.10 sec)
mysql> insert into UniqueAutoId values();
Query OK, 1 row affected (0.10 sec)
すべてのレコードを表示して確認してみましょう。
mysql> select *from UniqueAutoId;
実行結果は以下のとおりです。IDが1から5まで連番で採番されています。
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set (0.00 sec)
最大IDを削除した場合の挙動
DELETE文を使って、id=5のレコード(最大のID)を削除します。
mysql> DELETE from UniqueAutoId where id=5;
Query OK, 1 row affected (0.14 sec)
レコードを表示すると、以下のようになります。
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
4 rows in set (0.00 sec)
この状態で新しいレコードを挿入すると、削除されたid=5が再利用されることがあります。
途中のIDを削除した場合の挙動
今度は、連番の途中にあるid=2のレコードを削除してみます。
mysql> delete from UniqueAutoId where id=2;
Query OK, 1 row affected (0.15 sec)
再度、レコードを表示します。
+----+
| id |
+----+
| 1 |
| 3 |
| 4 |
+----+
3 rows in set (0.00 sec
まとめ
このように、途中のIDを削除するとid=2が欠けた状態(断片化)が発生します。AUTO_INCREMENTの値は一度採番されると基本的に巻き戻らないため、削除による欠番はそのまま残ります。アプリケーション側で連番の連続性を前提とした処理を行っている場合は、この挙動を十分に理解しておくことが重要です。
-
MySQLのAUTO_INCREMENTとは?自動採番と初期値の設定方法をわかりやすく解説
AUTO_INCREMENT属性の基本MySQLのAUTO_INCREMENT属性は、新しい行に対して一意の識別子(連番)を自動的に生成するために使用されます。カラムが「NOT NULL」として宣言されている場合、そのカラムにNULLを代入することで、連番のシーケンスを生成することが可能です。AUTO_INCREMENTカラムに任意の値を挿入すると、そのカラムは指定した値に設定され、同時にシーケンスもリセットされます。以降は、挿入された最大値を起点として、連続した値が自動的に生成されていきます。また、既存のAUTO_INCREMENTカラムを更新した場合も、AUTO_INCREMENTのシーケ
-
MySQLでシーケンスを作成する方法|AUTO_INCREMENTの使い方とルールを解説
MySQLにおけるシーケンスとは?MySQLにおける「シーケンス」とは、1(指定した場合は0)から始まり、昇順で自動生成される整数の連番のことです。多くのアプリケーションでは、レコードを一意に識別するための番号を発行する目的でシーケンスが利用されています。具体例代表的な例としては、CRMシステムの顧客ID、人事管理システムの社員番号、設備管理システムの機器番号などが挙げられます。MySQLでシーケンスを自動的に作成するには、対象のカラムにAUTO_INCREMENT属性を設定します。通常は、主キー(PRIMARY KEY)カラムに対して適用するのが一般的です。AUTO_INCREMENTを使用