InnoDB と MyISAM の AUTO_INCREMENT の違い
http://ftp.ku.ac.th/pub/mirror/mysql/doc/refman/5.1/ja/innodb-auto-increment-column.html
InnoDB と MyISAM では AUTO_INCREMENT 値の扱いに違いがあり、InnoDB は再起動するとインクリメント値が挿入されているレコードのIDの最大値になり、MyISAM では再起動してもインクリメント値は保持される。つまり、id と name からなるテーブルがあり、id がオートインクリメントされるとして、
insert into test set name='aaa'; insert into test set name='bbb'; insert into test set name='bbb';
とすると、
1 | aaa |
2 | bbb |
3 | ccc |
となるわけだが、delete from test; 後に mysqld をリスタートしたときの挙動が異なり、
insert into test set name='ddd';
とすると、
InnoDB | id=1, name='ddd' |
MyISAM | id=4, name='ddd' |
となる。
これはハマる。実例では、あるテーブルAのレコード数が増えてきたので、必要ないレコードをIDそのままに移動させたのだが、テーブルAがinnoだったため、移動させたレコードのIDとテーブルAのIDで不整合が起こる、という問題が起こった。冷静に考えれば InnoDB はメモリ上にインクリメント値を保存しているのでこの仕様も頷ける。