引き続き統合Webアプリケーションを作成中だけど、MyISAMで作っているテーブルのINSERTテストが終わったので不要な行データをphphMyAdmin経由で丸々削除すると、AUTO INCREMENTレコードで採番されるユニークコードに欠番ができてしまう。その対策の話。


AUTO INCREMENTレコードはストレージエンジンがMyISAMタイプだとディスク保持になるので、行が削除される場合は必ず欠番が発生する。RDBとしてはユニークコードを取り扱うのだからこれで良いのだけど、あとで消すのがわかりきっているデータを入力しているので(たとえば空のデータを100連発とか)開発環境では削除してみたくなる。
そんな場合、ALTER TABLEをつかって、いったんテーブルをInnoDBにしてMySQLを再起動する。InnoDBの場合はAUTO INCREMENTの採番はDB起動時のMAXCountを取得して、その値をメモリに保持することで行われているから、再起動でデータの並びはPrimary key降順になり、AUTO INCREMENTの最大値もリセットされる。そのあとで必要であれば再びALTER TABLEを使ってMyISAMタイプに戻せばよい。

ちなみにストレージエンジンInnoDBはトランザクション処理が可能で行ロックができるのがメリット。MyISAMは標準形式でハイパフォーマンスだがトランザクション処理はサポートしない。大抵の教科書にはこれを使うように書いてある(トランザクション処理なんて、Webショッピングでもない限り必要ないだろうし、これは正しく思える)。HEAPは全部オンメモリのリードオンリー用途(ディスクに書き込まない)。

だけど、この方法は開発環境だけでうまくいくと思う。レンタルサーバだとデータベースサーバを再起動できないから、AUTO INCREMENTの値をリセットすることはできない。この問題は、RDBからすべてをバックアップして、壊れたテーブルに再投入(ロールバック)しようとする時に障害になる。AUTO INCREMENTレコードには値を入力できないからだ。大抵の場合は、この時点でAUTO INCREMENTレコードを書き込み件数としてそのまま表示することを諦めて、別の方法でシーケンシャル・ナンバーを振ることになるだろう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です