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
に固有の AUTO_INCREMENT
の使用方法の詳細は、セクション15.6.1.6「InnoDB での AUTO_INCREMENT 処理」 を参照してください。
-
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
属性を割り当てる方法: セクション13.1.20「CREATE TABLE ステートメント」、およびセクション13.1.9「ALTER TABLE ステートメント」。AUTO_INCREMENT
の、NO_AUTO_VALUE_ON_ZERO
SQL モードによる動作の違い: セクション5.1.11「サーバー SQL モード」。LAST_INSERT_ID()
関数を使用して最新のAUTO_INCREMENT
値を見つける方法: セクション12.16「情報関数」。使用する
AUTO_INCREMENT
値の設定: セクション5.1.8「サーバーシステム変数」。AUTO_INCREMENT
とレプリケーション: セクション17.5.1.1「レプリケーションと AUTO_INCREMENT」。レプリケーションに使用できる
AUTO_INCREMENT
関連のサーバーシステム変数 (auto_increment_increment
とauto_increment_offset
): セクション5.1.8「サーバーシステム変数」。