SQLのTRUNCATE
とDELETE
はどちらもデータベースのテーブルからデータを削除するためのコマンドですが、動作や用途に違いがあります。
以下では、それぞれの特徴や違いについて詳しく説明します。
なお、一般的な内容にまとめておりますので、各製品の仕様をご確認の上、実行してください。
基本的な概要
DELETE
コマンド- 特定の行を条件に従って削除するために使用します。
条件を指定しなければ、テーブル内のすべての行を削除します。 - データを1行ずつ削除するため、削除後にトリガーや制約が適用されます。
- 削除操作はトランザクションログに記録されるため、ロールバックが可能です。
- 特定の行を条件に従って削除するために使用します。
TRUNCATE
コマンド- テーブルの全行を一度に削除するためのコマンドです。条件指定はできず、テーブル全体をクリアします。
- 行ごとの削除は行わず、ページ単位でデータを削除するため、処理速度が速いです。
- トランザクションログにはページの解放が記録されるだけなので、削除操作自体の詳細は残りません。
コマンドの違い
特徴 | DELETE | TRUNCATE |
---|---|---|
削除対象 | 条件付きの行削除が可能 | テーブル全体の行を削除 |
トランザクション | ロールバック可能 | ロールバック可能だが動作が異なる |
トリガーの実行 | トリガーが実行される | トリガーは実行されない |
自動増分(IDENTITY) | リセットされない | 自動的にリセットされる |
制約(外部キーなど) | 参照先のテーブルに依存する | 制約があれば使用できない |
パフォーマンス | 削除行ごとの処理が必要 | テーブル全体の削除が高速 |
詳細な違い
削除の範囲と用途
DELETE
の用途- 特定の条件でデータを削除したい場合に使います。たとえば、ある日付以前のデータのみ削除するなど、柔軟な削除が可能です。
- テーブルのすべての行を削除する場合も使えますが、
DELETE
文を実行するたびに1行ずつ処理されるため、行数が多いと時間がかかることがあります。
TRUNCATE
の用途- テーブル全体を一度にクリアしたいときに使います。特に大量のデータを削除する場合に高速です。
- テーブルのスキーマ(列構造)やインデックスはそのまま保持されますが、データのみが削除されます。
トランザクションとロールバック
DELETE
- トランザクションログに個々の削除が記録されるため、操作の途中でエラーが発生しても元の状態に戻せます(ロールバックが可能)。
- トランザクションを明示的に使用することで、複数の
DELETE
操作を一度にロールバックすることもできます。
TRUNCATE
- トランザクションログにはページの解放が記録されるだけなので、
DELETE
に比べてログの記録量が少なく、処理が高速です。 - ロールバック可能な場合もありますが、トランザクションログの詳細情報が少ないため、制限があります。
- トランザクションログにはページの解放が記録されるだけなので、
トリガーや外部キーの制約
DELETE
DELETE
操作時には、削除される行に対して定義されているトリガーが実行されます。また、外部キー制約が設定されている場合は、参照されているテーブルのデータも考慮する必要があります。
TRUNCATE
- トリガーが実行されません。また、外部キー制約が設定されているテーブルには
TRUNCATE
を実行できません。
- トリガーが実行されません。また、外部キー制約が設定されているテーブルには
自動増分列(IDENTITY)の扱い
DELETE
- テーブルの
IDENTITY
列(自動増分)はリセットされず、削除後に追加される新しいデータは、元の自動増分値の次の値から始まります。
- テーブルの
TRUNCATE
- テーブルの
IDENTITY
列がリセットされ、最初から再カウントされます。
- テーブルの
使用の注意点
DELETE
を使うべき場合- 特定の行だけを削除したいときや、トリガーを実行する必要がある場合。
- データ削除後も
IDENTITY
列の値を保持したいとき。
TRUNCATE
を使うべき場合- テーブルの全データを効率的に削除したい場合や、データ量が多い場合。
- 外部キー制約がないテーブルで高速なデータ削除が求められる場合。
使用例
以下のDELETE
文では、”Sales”部門の従業員データのみを削除しますが、TRUNCATE
文ではテーブル全体のデータが削除されます。
-- DELETE文の例
DELETE FROM Employees WHERE Department = 'Sales';
-- TRUNCATE文の例
TRUNCATE TABLE Employees;
まとめ
DELETE
とTRUNCATE
は目的によって使い分けるべきです。特定の条件でデータを削除する場合は、DELETE
が適しており、テーブル全体を高速にクリアする場合にはTRUNCATE
が効果的です。