アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < 転職した

ざっくりSQL入門 #8:クエリを書く<データの削除編>

MySQLを前提に書いています。一部関数などは方言差がある場合もあるのでご注意ください。

今回は、DELETEやTRUNCATEの構文を用いて、レコードの削除を行う方法について。


DELETEとは

指定したレコードを削除します。
指定方法はおなじみWHERE句。

DELETE FROM 【テーブル名】
WHERE       【条件】

WHERE句の条件に合うレコードがすべて削除されますし、
WHERE句を省略すると全件削除されるため、実行前にはくれぐれも注意してください。

TRUNCATEとは

指定したテーブルを空にします。

TRUNCATE TABLE 【テーブル名】

これだけ。
空にするということはつまり全件削除されるため、
こちらも実行前にはくれぐれも注意してください。

全件削除するときはどちらがいいの?

前述のとおり、DELETEもWHERE句を省略すればテーブルが空になります。
TRUNCATEとどちらを用いるべきかは、
以下の違いを参照の上、適した方を選ぶことになります。

TRUNCATE DELETE
速度 高速 低速
auto_increment 初期化される 変わらない
トランザクション ロールバック不可(暗黙のコミット) ロールバックできる

少なくとも、「auto_incrementを維持したい」「トランザクション内で実行する」という場合は
DELETEを選ぶ必要があります。
(todo::トランザクションについては後日書きます)

これらの差異は、
TRUNCATEは内部的に「テーブルを一度削除して同じ構造の空テーブルを作る」という処理で、
DELETEはあくまで「レコードを削除する」という処理、という根本的な違いから来ています。

削除対象がどれだけあろうとテーブルを作り直すだけのTRUNCATEは高速ですが、
新しいテーブルなのでauto_incrementもリセットされますし、
消えるレコードの中身を見ることもないので復元ができない…ということです。