PHP で MySQL を操作するのに役立つリファレンス

MySQL FAQ

AUTO_INCREMENT が最大値に達するとどうなりますか?

スポンサードリンク
AUTO_INCREMENT の列がプライマリーキーなど一意の値のみ許容している場合
 → 重複(一意制約違反)でエラーになります。

AUTO_INCREMENT の列が重複する値を許容している場合
 → 最大値以降は、最大値が連続して採番されます。

MySQL で AUTO_INCREMENT を設定した列が最大値に達した場合、その後は最大値と同じ値が自動採番されます。その為、AUTO_INCREMENT の重複を許容しない プライマリキーなどが設定されている場合、 INSERT 時にキー重複となり ERROR 1062 (23000): Duplicate entry '***' for key 'PRIMARY' などのエラーが発生します。もし AUTO_INCREMENT の列が重複を許容している場合は、最大値に達した後は最大値と同じ値で行を挿入します。

尚、Oracleのシーケンスにある CYCLE オプションのような、循環シーケンスの設定は MySQL ではできません。

以下では、最大値に達した場合の実際の動作を見ていきます。

AUTO_INCREMENT の列が重複を許容しない場合

AUTO_INCREMENT を設定した列が重複を許容していない場合、最大値に達した後は重複エラーになることを、次のコードを実行して試してみます。

サンプルコード
/* AUTO_INCREMENT を設定した列があるテーブルの作成 */
CREATE TABLE ITEM_LIST (
    ITEM_ID   TINYINT AUTO_INCREMENT,
    ITEM_NAME VARCHAR(100),
    /* AUTO_INCREMENT 列をプライマリーキーに設定 */ 
    PRIMARY KEY(ITEM_ID) 
);

/* 上記テーブルのITEM_IDに最大値の 127 より 1 小さい 126 を挿入 */
INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (126, 'MySQL FAQ');

/* AUTO_INCREMENT で採番 */
INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (NULL, 'MAX VALUE');

/* 最大値が入った状態で AUTO_INCREMENT で採番 */
INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (NULL, 'OVER MAX');

/* 登録されたデータを全件確認 */
SELECT * FROM ITEM_LIST;

実行結果は次の通りです。最大値に達した後、さらに行を挿入しようとするとキー重複でエラーになり挿入できていないことが分かります。

mysql> /* AUTO_INCREMENT を設定した列があるテーブルの作成 */
mysql> CREATE TABLE ITEM_LIST (
    ->     ITEM_ID   TINYINT AUTO_INCREMENT,
    ->     ITEM_NAME VARCHAR(100),
    ->     /* AUTO_INCREMENT 列をプライマリーキーに設定 */
    ->     PRIMARY KEY(ITEM_ID)
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql>
mysql> /* 上記テーブルのITEM_IDに最大値の 127 より 1 小さい 126 を挿入 */
mysql> INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (126, 'MySQL FAQ');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> /* AUTO_INCREMENT で採番 */
mysql> INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (NULL, 'MAX VALUE');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> /* 最大値が入った状態で AUTO_INCREMENT で採番 */
mysql> INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (NULL, 'OVER MAX');
ERROR 1062 (23000): Duplicate entry '127' for key 'PRIMARY'  ← エラー発生 
mysql>
mysql> /* 登録されたデータを全件確認 */
mysql> SELECT * FROM ITEM_LIST;
+---------+-----------+
| ITEM_ID | ITEM_NAME |
+---------+-----------+
|     126 | MySQL FAQ |
|     127 | MAX VALUE |
+---------+-----------+
2 rows in set (0.00 sec)

AUTO_INCREMENT の列が重複を許容する場合

AUTO_INCREMENT を設定した列が重複を許容している場合、最大値に達した後は最大値と同じ値で行が挿入されるのか、次のコードを実行して試してみます。

サンプルコード
/* AUTO_INCREMENT を設定した列があるテーブルの作成 */
CREATE TABLE ITEM_LIST (
    ITEM_ID   TINYINT AUTO_INCREMENT,
    ITEM_NAME VARCHAR(100),
    /* AUTO_INCREMENT 列に INDEX のみ設定。重複は許容。 */ 
    INDEX(ITEM_ID) 
);

/* 上記テーブルのITEM_IDに最大値の 127 より 1 小さい 126 を挿入 */
INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (126, 'MySQL FAQ');

/* AUTO_INCREMENT で採番 */
INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (NULL, 'MAX VALUE');

/* 最大値が入った状態で AUTO_INCREMENT で採番 */
INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (NULL, 'OVER MAX');

/* 登録されたデータを全件確認 */
SELECT * FROM ITEM_LIST;

実行結果は次の通りです。最大値に達した後、さらに行を挿入すると最大値と同じ値が採番されて挿入されていることが分かります。

mysql> /* AUTO_INCREMENT を設定した列があるテーブルの作成 */
mysql> CREATE TABLE ITEM_LIST (
    ->     ITEM_ID   TINYINT AUTO_INCREMENT,
    ->     ITEM_NAME VARCHAR(100),
    ->     /* AUTO_INCREMENT 列に INDEX のみ設定。重複は許容。 */
    ->     INDEX(ITEM_ID)
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql>
mysql> /* 上記テーブルのITEM_IDに最大値の 127 より 1 小さい 126 を挿入 */
mysql> INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (126, 'MySQL FAQ');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> /* AUTO_INCREMENT で採番 */
mysql> INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (NULL, 'MAX VALUE');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> /* 最大値が入った状態で AUTO_INCREMENT で採番 */
mysql> INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (NULL, 'OVER MAX');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> /* 登録されたデータを全件確認 */
mysql> SELECT * FROM ITEM_LIST;
+---------+-----------+
| ITEM_ID | ITEM_NAME |
+---------+-----------+
|     126 | MySQL FAQ |
|     127 | MAX VALUE |
|     127 | OVER MAX  |  ← 最大値と同じ値が採番された 
+---------+-----------+
3 rows in set (0.00 sec)

mysql>
スポンサードリンク

AUTO_INCREMENT

その他のカテゴリー一覧