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 | +----+---------+
SQL 関数 LAST_INSERT_ID()
または C API
関数 mysql_insert_id()
を使用すると、最後に生成した
AUTO_INCREMENT
の値を取得できます。
注意:複数レコードを同時に挿入する場合、
LAST_INSERT_ID()
/mysql_insert_id()
は、実際には最初に挿入したレコードの
AUTO_INCREMENT
の値を返します。これにより、レプリケーション設定の場合に、ほかのサーバでも正しく複数行の挿入を再現できます。
MyISAM
テーブルと BDB
テーブルでは、複合インデックスの2つめのカラムに
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) ); 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
値が再使用されることになります。これは
MyISAM
テーブルの場合にも発生する可能性があります(通常は
AUTO_INCREMENT
が再使用されることはない)。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.