データベースからレコード(テーブル)を削除するSQL文は3種類あります。
なんとなく違いが分かるようで分からない方のためにDELETE文とTRANCATE文、DROP文の違いをご紹介します。
臨機応変に使い分けてください。
DELETE文とTRANCATE文とDROP文の違い
ざっくりまとめると以下の表のようになります。
命令 | 削除対象 | 削除の取消(※) | 実行後のテーブル |
①DELETE文 | レコード | 可 | 維持 |
②TRANCATE文 | テーブル | 不可 | 維持 |
③DROP文 | テーブル | 不可 | 消去 |
※削除の取り消し=ROLLBACK(ロールバック)可能
DELETE文
DELETE FROM テーブル名 WHERE フィールド名=xxx;
レコード単位でデータを削除します。
WHERE句を記述しなければテーブル内の全レコード削除となります。
COMMITしていなければROLLBACKすることで削除の取り消しが可能です。
一般的なデータの削除はこちらの構文を使うことが多いと思います。
※全レコード削除してもオートインクリメントの設定は残ります。(削除前の最終値が保持されます)
TRANCATE文
TRUNCATE TABLE テーブル名;
TRUNCATE文は結果的にはテーブル内の全レコード削除した状態となるので一見DELETE文にWHERE句を記述しなかった場合と同じに見えます。
ですが、TRUNCATEは一旦無条件にテーブルを削除(DROP)した後、改めて空のテーブルを再作成する処理となります。
このため、オートインクリメント設定は初期化されます。
また、物理的にテーブルを削除するため一旦実行すると元に戻すことはできません。
かなり注意が必要な命令ですが、ログを残さないため処理は非常に高速です。
主にTRANCATEを使うシーンは、作業用の一時テーブルの一括クリアやデータ移行(コンバート時)時にバックアップを取ったうえで計画実行する際などです。
通常時は処理速度優先など、やむを得ない事情がない限りは使いたくない感じです(怖いので…)
DROP文
DROP TABLE テーブル名;
DROP文は先ほどのTRANCATEでも触れましたが、単純にテーブルの削除となります。
こちらもログは残りませんので削除の取り消しはできません。
注意して実行しましょう。
TRANCATEと同様使うシーンは作業用の一時テーブルの削除などです。
まとめ
データの削除は基本的にはDELETE文で事足ります。
【全データ削除】という意味合いではDELETEとTRANCATEは同義ですが違いを意識して正しく使いましょう!