MySQL 8.0 リファレンスマニュアル


3.6.9 AUTO_INCREMENT の使用

AUTO_INCREMENT 属性を使用すると、新しい行に一意の識別子を生成できます。

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;

次の結果が表示されます。

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

AUTO_INCREMENT カラムには値が指定されなかったため、MySQL が自動的にシーケンス番号を割り当てました。 NO_AUTO_VALUE_ON_ZERO SQL モードが有効になっていないかぎり、カラムに 0 を明示的に割り当てて順序番号を生成することもできます。 例:

INSERT INTO animals (id,name) VALUES(0,'groundhog');

カラムが NOT NULL と宣言されている場合は、NULL 割り当ててシーケンス番号を生成することもできます。 例:

INSERT INTO animals (id,name) VALUES(NULL,'squirrel');

他の値を AUTO_INCREMENT カラムに挿入すると、カラムはその値に設定され、次に自動的に生成される値が最大のカラム値から順番に続くように順序がリセットされます。 例:

INSERT INTO animals (id,name) VALUES(100,'rabbit');
INSERT INTO animals (id,name) VALUES(NULL,'mouse');
SELECT * FROM animals;
+-----+-----------+
| id  | name      |
+-----+-----------+
|   1 | dog       |
|   2 | cat       |
|   3 | penguin   |
|   4 | lax       |
|   5 | whale     |
|   6 | ostrich   |
|   7 | groundhog |
|   8 | squirrel  |
| 100 | rabbit    |
| 101 | mouse     |
+-----+-----------+

既存の AUTO_INCREMENT カラム値を更新すると、AUTO_INCREMENT 順序もリセットされます。

LAST_INSERT_ID() SQL 関数または mysql_insert_id() C API 関数を使用して、自動的に生成された最新の AUTO_INCREMENT 値を取得できます。 これらの関数は接続に固有の関数であるため、別の接続が同様に挿入を実行していても、戻り値は影響を受けません。

必要な最大順序値を保持するのに十分な大きさの AUTO_INCREMENT カラムには、最小の整数データ型を使用します。 カラムがデータ型の上限値に到達すると、次にシーケンス番号を生成しようとしたときには失敗します。 可能であれば、より広い範囲を可能にするために UNSIGNED 属性を使用します。 たとえば、TINYINT を使用する場合、許可される最大のシーケンス番号は 127 です。 TINYINT UNSIGNED の場合は最大値は 255 です。 すべての整数型の範囲は、セクション11.1.2「整数型 (真数値) - INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT」を参照してください。

注記

複数行を同時に挿入する場合、LAST_INSERT_ID()mysql_insert_id() は、実際には最初に挿入した行の AUTO_INCREMENT キーを返します。 これにより、レプリケーションセットアップで複数行の挿入を別のサーバーで正しく再現できます。

1 以外の AUTO_INCREMENT 値で開始するには、次のように、その値を CREATE TABLE または ALTER TABLE でセットします。

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

InnoDB の注意

InnoDB に固有の AUTO_INCREMENT の使用方法の詳細は、セクション15.6.1.6「InnoDB での AUTO_INCREMENT 処理」 を参照してください。

MyISAM の注意

  • MyISAM テーブルには、マルチカラムインデックス内のセカンダリカラムに AUTO_INCREMENT を指定することができます。 この場合、AUTO_INCREMENT カラムに生成される値は、MAX(auto_increment_column) + 1 WHERE prefix=given-prefix として計算されます。 これは、データを順序付きのグループに分割する場合に便利です。

    CREATE TABLE animals (
        grp ENUM('fish','mammal','bird') NOT NULL,
        id MEDIUMINT NOT NULL AUTO_INCREMENT,
        name CHAR(30) NOT NULL,
        PRIMARY KEY (grp,id)
    ) ENGINE=MyISAM;
    
    INSERT INTO animals (grp,name) VALUES
        ('mammal','dog'),('mammal','cat'),
        ('bird','penguin'),('fish','lax'),('mammal','whale'),
        ('bird','ostrich');
    
    SELECT * FROM animals ORDER BY grp,id;

    次の結果が表示されます。

    +--------+----+---------+
    | grp    | id | name    |
    +--------+----+---------+
    | fish   |  1 | lax     |
    | mammal |  1 | dog     |
    | mammal |  2 | cat     |
    | mammal |  3 | whale   |
    | bird   |  1 | penguin |
    | bird   |  2 | ostrich |
    +--------+----+---------+

    この場合 (AUTO_INCREMENT カラムがマルチカラムインデックスの一部として使用されている場合)、グループ内で最大の AUTO_INCREMENT 値を持つ行を削除すると、そのグループで同じ AUTO_INCREMENT 値が再使用されることになります。 これは、通常は AUTO_INCREMENT 値が再使用されることのない MyISAM テーブルの場合にも発生します。

  • AUTO_INCREMENT カラムが複合インデックスの一部である場合、MySQL は AUTO_INCREMENT カラムで始まるインデックスを使用してシーケンス値を生成します (ある場合)。 たとえば、animals テーブルにインデックス PRIMARY KEY (grp, id)INDEX (id) が含まれている場合、MySQL はシーケンス値の生成で PRIMARY KEY を無視します。 その結果、テーブルには grp 値ごとに 1 つのシーケンスではなく、単一のシーケンスが含まれることになります。

参照情報

AUTO_INCREMENT に関する詳細の参照先を次に示します。


関連キーワード:  AUTO, INCREMENT, カラム, animals, テーブル, セクション, 最大, 生成, INSERT, サーバー