ざっくり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を選ぶ必要があるというわけです。
(トランザクションについては後から説明しています)
これらの差異は、
TRUNCATEは内部的に「テーブルを一度削除して同じ構造の空テーブルを作る」という処理で、
DELETEはあくまで「レコードを削除する」という処理、という根本的な違いから来ています。
削除対象がどれだけあろうとテーブルを作り直すだけのTRUNCATEは高速ですが、
新しいテーブルなのでauto_incrementもリセットされますし、
消えるレコードの中身を見ることもないので復元ができない…ということです。