http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html
3.6.9。 AUTO_INCREMENTの使用
AUTO_INCREMENT属性を使用して、新しい行の一意のIDを生成できます。
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; Which returns: +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | +----+---------+
AUTO_INCREMENT列に値が指定されていないため、MySQLはシーケンス番号を自動的に割り当てました。列にNULLまたは0を明示的に割り当てて、シーケンス番号を生成することもできます。
最新のAUTO_INCREMENT値は、LAST_INSERT_ID()SQL関数またはmysql_insert_id()CAPI関数を使用して取得できます。これらの関数は接続固有であるため、それらの戻り値は、挿入を実行している別の接続の影響を受けません。
AUTO_INCREMENT列には、必要な最大シーケンス値を保持するのに十分な大きさの最小の整数データ型を使用します。列がデータ型の上限に達すると、シーケンス番号を生成する次の試みは失敗します。可能であればUNSIGNED属性を使用して、より広い範囲を許可します。たとえば、TINYINTを使用する場合、最大許容シーケンス番号は127です。TINYINTUNSIGNEDの場合、最大は255です。11.2.1項「整数型(正確な値)-INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT」を参照してください。 」は、すべての整数型の範囲を表します。
注複数行の挿入の場合、LAST_INSERT_ID()およびmysql_insert_id()は、実際には、挿入された最初の行からAUTO_INCREMENTキーを返します。これにより、レプリケーション設定で他のサーバーに複数行の挿入を正しく再現できます。
AUTO_INCREMENT列が複数のインデックスの一部である場合、MySQLは、AUTO_INCREMENT列で始まるインデックス(存在する場合)を使用してシーケンス値を生成します。たとえば、animalsテーブルにインデックスPRIMARY KEY(grp、id)とINDEX(id)が含まれている場合、MySQLはシーケンス値を生成するためにPRIMARYKEYを無視します。その結果、テーブルには、grp値ごとのシーケンスではなく、単一のシーケンスが含まれます。
1以外のAUTO_INCREMENT値で開始するには、次のように、CREATETABLEまたはALTERTABLEでその値を設定します。
mysql> ALTER TABLE tbl AUTO_INCREMENT =100; InnoDB Notes
InnoDBテーブルの場合、一連のINSERTステートメントの途中で自動インクリメント値を含む列を変更する場合は注意が必要です。たとえば、UPDATEステートメントを使用して新しい大きな値を自動インクリメント列に配置すると、後続のINSERTで「重複エントリ」エラーが発生する可能性があります。自動インクリメント値がすでに存在するかどうかのテストは、DELETEの後にさらにINSERTステートメントを実行する場合、またはトランザクションをCOMMITするが、UPDATEステートメントの後で実行しない場合に発生します。
MyISAMノート
MyISAMテーブルの場合、複数列インデックスの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) ) 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; Which returns: +--------+----+---------+ | 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の詳細については、こちらをご覧ください:
AUTO_INCREMENT属性を列に割り当てる方法:セクション13.1.17「CREATETABLE構文」およびセクション13.1.7「ALTERTABLE構文」
NO_AUTO_VALUE_ON_ZERO SQLモードに応じたAUTO_INCREMENTの動作:セクション5.1.7「サーバーSQLモード」。
LAST_INSERT_ID()関数を使用して、最新のAUTO_INCREMENT値を含む行を検索する方法:セクション12.14「情報関数」。
使用するAUTO_INCREMENT値の設定:セクション5.1.4「サーバーシステム変数」。
AUTO_INCREMENTとレプリケーション:セクション16.4.1.1「レプリケーションとAUTO_INCREMENT」。
レプリケーションに使用できるAUTO_INCREMENTに関連するサーバーシステム変数(auto_increment_incrementおよびauto_increment_offset):セクション5.1.4「サーバーシステム変数」。
http://search.oracle.com/search/search?q=auto_increment&group=Documentation&x=0&y=0