MySQL の主キーとかに auto_increment 属性を付けておくと連番の ID を自動生成してくれるので便利です。
例えばテーブル定義時にこんな感じで指定しておくと、
データ挿入時に id を指定せず(気にせずに)他の値だけを挿入すればよくなって、
ユニークな ID が自動で割り当てられる、ということが実現できます:
このように便利な auto_increment 属性ですが、便利な反面でコントロールする必要が出た場合に少しコツが必要になります。例えば 10 レコード入った時点で最後のデータに間違いが判明して、削除してしまったとします:
この時点でテーブルには 9 件のレコードが入っています。ここで次のデータをインサートすると auto_increment はリセットされずに id = 11 として 10 件目のデータが挿入されます:
ID をどう考えるかにもよりますが、この挙動を(ユニークである、という点は確保できているので)これはこれで OK と考えるのであれば特に気にする必要はありません。ただ連番ではなくなってしまうので、auto_increment を自分の意図で(上記の例であれば 10 から再スタートするように)リセットしたくなることもあります。
その場合は、以下のコマンドを実行します:
names テーブルの auto_increment 属性値を 10 に(強制的に)変更しました。この状態からインサートすると、次に入るレコードの ID は 10 になります:
ID は本来内部的に利用するべきものなので抜け番号があったからまずいわけでもなく、また連番でないといけないような制約が入るのは本来あまりいいことではありません。でもまあ気持ち的にスッキリはしますかね。
例えばテーブル定義時にこんな感じで指定しておくと、
> create table names( id int primary key auto_increment, name varchar(100) );
データ挿入時に id を指定せず(気にせずに)他の値だけを挿入すればよくなって、
> insert into names( name ) values( '鈴木' ); > insert into names( name ) values( '佐藤' ); > insert into names( name ) values( '田中' ); > insert into names( name ) values( '山田' ); :
ユニークな ID が自動で割り当てられる、ということが実現できます:
> select * from names; +----+------+ | id | name | +----+------+ | 1 | 鈴木 | | 2 | 佐藤 | | 3 | 田中 | | 4 | 山田 | : +----+------+
このように便利な auto_increment 属性ですが、便利な反面でコントロールする必要が出た場合に少しコツが必要になります。例えば 10 レコード入った時点で最後のデータに間違いが判明して、削除してしまったとします:
> select * from names;
+----+------+
| id | name |
+----+------+
| 1 | 鈴木 |
| 2 | 佐藤 |
| 3 | 田中 |
| 4 | 山田 |
:
| 9 | 山本 |
| 10 | 木村 | ←ミスしたので削除↓
+----+------+
> delete from names where id = 10;
> select * from names;
+----+------+
| id | name |
+----+------+
| 1 | 鈴木 |
| 2 | 佐藤 |
| 3 | 田中 |
| 4 | 山田 |
:
| 9 | 山本 |
+----+------+
この時点でテーブルには 9 件のレコードが入っています。ここで次のデータをインサートすると auto_increment はリセットされずに id = 11 として 10 件目のデータが挿入されます:
> insert into names( name ) values( '武田' );
> select * from names;
+----+------+
| id | name |
+----+------+
| 1 | 鈴木 |
| 2 | 佐藤 |
| 3 | 田中 |
| 4 | 山田 |
:
| 9 | 山本 |
| 11 | 武田 |
+----+------+
ID をどう考えるかにもよりますが、この挙動を(ユニークである、という点は確保できているので)これはこれで OK と考えるのであれば特に気にする必要はありません。ただ連番ではなくなってしまうので、auto_increment を自分の意図で(上記の例であれば 10 から再スタートするように)リセットしたくなることもあります。
その場合は、以下のコマンドを実行します:
> alter table names auto_increment = 10;
names テーブルの auto_increment 属性値を 10 に(強制的に)変更しました。この状態からインサートすると、次に入るレコードの ID は 10 になります:
> insert into names( name ) values( '武田' );
> select * from names;
+----+------+
| id | name |
+----+------+
| 1 | 鈴木 |
| 2 | 佐藤 |
| 3 | 田中 |
| 4 | 山田 |
:
| 9 | 山本 |
| 10 | 武田 |
+----+------+
ID は本来内部的に利用するべきものなので抜け番号があったからまずいわけでもなく、また連番でないといけないような制約が入るのは本来あまりいいことではありません。でもまあ気持ち的にスッキリはしますかね。