[MySQL] truncateの挙動

DBのストレージをMyISAMからInnoDBにしてみたら、テストを通らなくなったので調べてみた。各テストの前にテーブルをtruncateで初期化して、テストデータを流し込むようにしていたところが動いていない模様。

MySQLトラブル事例 SmartyStyle

Q8. 数値型カラムにAUTO_INCREMENTを指定して、データを4件挿入しました。DELETE文でデータを消去し、再度挿入しましたが、数値型カラムが5から始まります。1から挿入したいのですが、どうすればいいのですか?(MySQL4.0、4.1、5.0共通)

A8. MyISAMテーブルであれば、DELETE文ではなくTRUNCATE文を実行することで、カラムを再び1から入力できます。MySQL5.0では、MyISAMInnoDB共にこの方法でリセットできます。MySQL4.0、4.1では、MyISAMではリセットできますが、InnoDBのリセットはできません。

MySQL5.0だとMyISAM, InnoDB共にtruncateでリセットできるんですが、MySQL4.0, 4.1でInnoDBを使うと、truncateでauto_incrementの値がリセットされないようです。

実際にはtruncateを呼び出した時にdeleteが走っているらしく、そのためauto_increment値の初期化が行われないようです。必然的に「全レコードを削除するよりtruncateの方が速い」というのも、このケースでは成り立ちません。

MySQL4.0, 4.1でauto_increment値をリセットするには、全てのレコードを削除した上で

ALTER TABLE テーブル名 AUTO_INCREMENT = 1;

を実行してやるといいようです。

そもそも大した知識がない上に、5で覚えたことが多いから、4系のノウハウが足りてないなぁ…