このページは機械翻訳したものです。
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-prefixCREATE 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_ZEROSQL モードによる動作の違い: セクション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「サーバーシステム変数」。