タイトルそのままですが、ちょっとだけ社内で話題になったのでメモ。
Truncateって?
Truncateはデータベース(以下DB)で、テーブルのデータを一括で削除するコマンドです。
1 |
truncate table テーブル名; |
って感じに書いて実行すると、テーブル名の中身が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に見えてしまいますが、良い勉強になりました。