InnoDB と MyISAM の AUTO_INCREMENT の違い

http://ftp.ku.ac.th/pub/mirror/mysql/doc/refman/5.1/ja/innodb-auto-increment-column.html

InnoDBMyISAM では 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 はメモリ上にインクリメント値を保存しているのでこの仕様も頷ける。

近況報告

最近このブログのメモ化が著しいと思った。
モバイルウィジェットtwitterクライアント鋭意作成中。探したけど見つからないので、自分で作ることにした。
あとは……インベーダごめんなさい、全然見れてないです; 流石に夏はそれなりに予定入るか……。