MySQLでTruncateはRollback出来るのか?

タイトルそのままですが、ちょっとだけ社内で話題になったのでメモ。

Truncateって?

Truncateはデータベース(以下DB)で、テーブルのデータを一括で削除するコマンドです。

って感じに書いて実行すると、テーブル名の中身が1行残らず削除されます。

 

Rollbackって?

Rollbackというのは、DBでデータを戻すための作業です。

 

単に「戻す」と書くと語弊があるかもですが、
データを操作する際に、途中でなんらかのエラーになった場合に
それまで操作した分(挿入、更新など)をなかったことに
つまり、操作する前にデータが戻ります。

 
ここら辺がわかりやすいです。
トランザクション処理をさらっとマスターしよう

 

結論

Rollback出来ません( ˘ω˘)スヤァ

 

Rollback出来る出来ないは、その操作がトランザクション内操作かどうかが重要なのですが、

MySQLではTruncateはトランザクション外で行われる操作なのでRollback不可です。

 

データを削除するということでは、deleteがあるかと思いますが
こちらは、トランザクション内での操作に当たるのでRollback対象となります。

 

これ、僕はてっきりDDL(Truncateとか)はロールバック出来ないと思ってたのですが
どうやらDB毎に実装異なるようで

 

【Rollback出来ない】

  • Oracle
  • MySQL

 

【Rollback出来る】

  • SQLServer
  • PostgreSQL

 

 

逆にTruncateで共通なのは、deleteより高速。。。という点なので
テーブルを1行残らず駆逐したい場合、パフォーマンス的にはTruncateが良さそうです。

 

Rollback出来る方では、他のDDL(create table、alter系)もRollbackが可能なようです。

 

僕は一番馴染みあるのがOracleだったために、DDLがトランザクション内操作なのが
どうも慣れなく変態DBに見えてしまいますが、良い勉強になりました。