状況
MySQL の本番 DB で、誤って入れたテストデータを消す作業。作業者は「BEGIN しておけば TRUNCATE でも戻せます」と言っている。
MySQL の TRUNCATE TABLE は、先に BEGIN を実行していても、ROLLBACK では取り消せない。
正答
○ 正しい
解説
正しい。MySQL の TRUNCATE TABLE は DDL として扱われ、暗黙のコミットを伴うため ROLLBACK では取り消せない。BEGIN の後に実行しても、その時点までの変更ごと確定してしまう。「BEGIN しておけば戻せる」は DELETE と同じ感覚で考えた誤解である。トランザクションで守りたいなら DELETE を使う(大きな表では遅く、ログも増える)。PostgreSQL の TRUNCATE はトランザクションの中なら ROLLBACK できるので、DB ごとに挙動が違う点にも注意する。いずれも実行前にバックアップを取る。
参考: dev.mysql.com
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ