概要
MySQLのTRUNCATE TABLE
句とトランザクションについて簡単にまとめる。
TRUNCATE TABLE
句について
このSQL句は指定したテーブルの中身を空にしたいときに使う。
結構強気にレコードが削除されるイメージで、パフォーマンスを優先しているらしい。
ロールバックに対応していなかったり、外部キー成約のあるテーブルに対しては実行する事ができない。
DELETE
句のようにロールバックできるDML(データ操作言語)句ではなく、DDL(データ定義言語)句として分類される。
↓公式ドキュメント
TRUNCATE TABLE
句とトランザクション
TRUNCATE TABLE句
に限らずDDL句に分類されるすべてが対象になる話ではあるが、DDL句のほとんどが実行後に暗黙的にコミットが実行されるらしい。これはDDL句らが若干特別な存在であるため、独自のトランザクションで処理することが望ましいと考えられているからっぽい。
実行していないからわからないが明示的にトランザクションのSQL文の中でTRUNCATE TABLE
句を実行するとトランケート直後にコミットが発生するため、そもそも実行できずエラーになるか、トランケート後の明示的なコミットで「トランザクションが無い」系のエラーが出るはず。
レコード削除時はDELETE
句を使ったほうが良さそう。
そもそもロールバックできないので本番DBなどではよっぽどの理由(処理時間がかかりすぎるなど)が無い限りトランケートは実行しないほうがいいかも。