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

MySQL FAQ

AUTO_INCREMENT の最大値はいくつですか?

スポンサードリンク
AUTO_INCREMENT の最大値は、列のデータ型の最大値と同じです。
但し BIGINT unsigned の場合、最大値より 1 小さい 18446744073709551614 が AUTO_INCREMENT で採番される最大値になります。(MySQL5.6.21での検証結果)

テーブルの列に AUTO_INCREMENT を設定した場合、その列に NULL を挿入すると MySQL で数値を自動採番しますが、その際の最大値は列に設定されたデータ型の最大値と同じになります。

データ型毎の最大値は次の通りです。

データ型最大値
TINYINT127
TINYINT unsigned255
SMALLINT32767
SMALLINT unsigned65535
MEDIUMINT8388607
MEDIUMINT unsigned16777215
INT2147483647
INT unsigned4294967295
BIGINT9223372036854775807
BIGINT unsigned18446744073709551615

以下では、AUTO_INCREMENT の最大値の上限が、列のデータ型の最大値と同じになっているかを実際にサンプルコードで確認します。

通常のデータ型の場合

BIGINT UNSIGNED 以外の場合、 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;

実行結果は次の通りです。AUTO_INCREMENT の列の値が TINYINT 型の最大値 127 に達した後は、それ以上 INCREMENT をせずに最大値が続けて採番されていることが分かります。

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.09 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>

BIGINT UNSIGNED の場合

BIGINT UNSIGNEDの場合、最大値より 1 小さい値を採番した後に採番しようとすると ERROR 1467 (HY000): Failed to read auto-increment value from storage engine というエラーが発生し行を挿入できません。次のサンプルコードを実行して実際に試してみます。

サンプルコード
CREATE TABLE ITEM_LIST (
    ITEM_ID   BIGINT UNSIGNED AUTO_INCREMENT,
    ITEM_NAME VARCHAR(100),
    /* AUTO_INCREMENT 列は INDEX の設定が必要 */ 
    INDEX(ITEM_ID) 
);

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

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

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

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

実行結果は次の通りです。最大値 18446744073709551615 が採番できずにエラーが発生していることが分かります。

mysql> CREATE TABLE ITEM_LIST (
    ->     ITEM_ID   BIGINT UNSIGNED AUTO_INCREMENT,
    ->     ITEM_NAME VARCHAR(100),
    ->     /* AUTO_INCREMENT 列は INDEX の設定が必要 */
    ->     INDEX(ITEM_ID)
    -> );
Query OK, 0 rows affected (0.07 sec)

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

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

mysql>
mysql> /* AUTO_INCREMENT で採番 → 18446744073709551615 */
mysql> INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME) VALUES (NULL, 'MAX VALUE');
ERROR 1467 (HY000): Failed to read auto-increment value from storage engine  ← エラー発生 
mysql>
mysql> /* 登録されたデータを全件確認 */
mysql> SELECT * FROM ITEM_LIST;
+----------------------+-------------+
| ITEM_ID              | ITEM_NAME   |
+----------------------+-------------+
| 18446744073709551613 | MySQL FAQ   |
| 18446744073709551614 | MAX VALUE-1 |
+----------------------+-------------+
2 rows in set (0.00 sec)

mysql>

AUTO_INCREMENT では BIGINT UNSIGNED の最大値は登録できませんが、値を指定して INSERT 文を実行すると普通に登録することができます。

/* AUTO_INCREMENT せずに BIGINT UNSIGNED の最大値を挿入 */
INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME)
               VALUES (18446744073709551615, 'MAX VALUE');

/* 登録されたデータを全件確認 */
SELECT * FROM ITEM_LIST;
mysql> /* AUTO_INCREMENT せずに BIGINT UNSIGNED の最大値を挿入 */
mysql> INSERT INTO ITEM_LIST (ITEM_ID, ITEM_NAME)
    ->                VALUES (18446744073709551615, 'MAX VALUE');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> /* 登録されたデータを全件確認 */
mysql> SELECT * FROM ITEM_LIST;
+----------------------+-------------+
| ITEM_ID              | ITEM_NAME   |
+----------------------+-------------+
| 18446744073709551613 | MySQL FAQ   |
| 18446744073709551614 | MAX VALUE-1 |
| 18446744073709551615 | MAX VALUE   |
+----------------------+-------------+
3 rows in set (0.00 sec)

mysql>
スポンサードリンク

AUTO_INCREMENT

その他のカテゴリー一覧