危険察知○×難易度 標準

状況

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

sqltruncatemysql

この問題を含む 危険察知 のテストを制限時間つきで解く

危険察知クイズへ