Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


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 が自動的にシーケンス番号を割り当てました。カラムに明示的に 0 を割り当ててシーケンス番号を生成することもできます。カラムが NOT NULL と宣言されている場合は、NULL 割り当ててシーケンス番号を生成することもできます。

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

AUTO_INCREMENT カラムには、必要な最大のシーケンス値を保持するのに十分な大きさを持つ最小の整数データ型を使用します。カラムがデータ型の上限値に到達すると、次にシーケンス番号を生成しようとしたときには失敗します。可能であれば、より広い範囲を可能にするために UNSIGNED 属性を使用します。たとえば、TINYINT を使用する場合、許可される最大のシーケンス番号は 127 です。TINYINT UNSIGNED の場合は最大値は 255 です。すべての整数型の範囲は、セクション11.2.1「整数型 (真数値) - 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 テーブルでは、一連の INSERT ステートメントの途中で自動インクリメント値を含むカラムを修正する場合は注意が必要です。たとえば、UPDATE ステートメントを使用して、自動インクリメントカラムに新しくより大きい値を入れると、後続の INSERT重複エラーになる場合があります。DELETE を実行したあとでさらに INSERT ステートメントが続く場合、またはトランザクションを COMMIT したが UPDATE ステートメントのあとではない場合に、自動インクリメント値がすでに存在するかどうかのテストが行われます。

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 に関する詳細の参照先を次に示します。