スポンサーリンク

【SQL】TRUNCATEとDELETEの違い

記事内に広告が含まれています。

SQLのTRUNCATEDELETEはどちらもデータベースのテーブルからデータを削除するためのコマンドですが、動作や用途に違いがあります。

以下では、それぞれの特徴や違いについて詳しく説明します。

なお、一般的な内容にまとめておりますので、各製品の仕様をご確認の上、実行してください。

スポンサーリンク

基本的な概要

  • DELETEコマンド
    • 特定の行を条件に従って削除するために使用します。
      条件を指定しなければ、テーブル内のすべての行を削除します。
    • データを1行ずつ削除するため、削除後にトリガーや制約が適用されます。
    • 削除操作はトランザクションログに記録されるため、ロールバックが可能です。
  • TRUNCATEコマンド
    • テーブルの全行を一度に削除するためのコマンドです。条件指定はできず、テーブル全体をクリアします。
    • 行ごとの削除は行わず、ページ単位でデータを削除するため、処理速度が速いです。
    • トランザクションログにはページの解放が記録されるだけなので、削除操作自体の詳細は残りません。
スポンサーリンク

コマンドの違い

特徴DELETETRUNCATE
削除対象条件付きの行削除が可能テーブル全体の行を削除
トランザクションロールバック可能ロールバック可能だが動作が異なる
トリガーの実行トリガーが実行されるトリガーは実行されない
自動増分(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;

まとめ

DELETETRUNCATEは目的によって使い分けるべきです。特定の条件でデータを削除する場合は、DELETEが適しており、テーブル全体を高速にクリアする場合にはTRUNCATEが効果的です。

スポンサーリンク
SQL
著者SNS
タイトルとURLをコピーしました