SQL の TRUNCATE と DELETE の違い
TRUNCATE と DELETE は、SQL でテーブル データを削除するときに 2 つのオプションを提供します。情報に基づいた意思決定を行うには、それぞれの異なる特性を理解することが重要です。
概要
データを保持せずにテーブル内のすべての行を迅速に削除することが目標の場合、通常は TRUNCATE の方が DELETE よりも高速です。ただし、システム固有の要因も考慮する必要があります。
ステートメントの種類
TRUNCATE はデータ定義言語 (DDL) ステートメントとして分類され、DELETE はデータ操作言語 (DML) ステートメントとして分類されます。この区別は、特定の状況における彼らの行動に影響を与えます。
コミットとロールバック
データベース ベンダーによっては、TRUNCATE がロールバックできる場合とできない場合があります。 PostgreSQL と SQL*Server では TRUNCATE のロールバックが可能ですが、Oracle ではコミットされた操作として扱われます。
宇宙リサイクル
TRUNCATE は、割り当てられたデータセグメントを解放することでストレージスペースを再利用します。一方、DELETE は、削除された行が占めていたスペースを保持します。
行範囲
TRUNCATE はテーブル内のすべての行を削除しますが、DELETE は条件に基づいて特定の行をターゲットにすることができます。
オブジェクトタイプ
TRUNCATE はテーブルまたはクラスター全体 (ベンダー固有) に適用できます。 DELETE はテーブルおよびクラスター内のテーブルに対して機能します。
データオブジェクト識別子
Oracle では、DELETE はデータ オブジェクト ID に影響しませんが、以前にデータがテーブルに挿入されていない限り、TRUNCATE は新しい ID を割り当てます。
フラッシュバック (Oracle)
DELETE はフラッシュバックをサポートしており、データを以前の状態から復元できます。一方、TRUNCATE は、切り捨て前の状態へのフラッシュバックを防ぎます。ただし、Oracle 11gR2 の FLASHBACK ARCHIVE 機能を使用すると、この問題を軽減できます。
権限
TRUNCATE 権限を付与できる機能はベンダーによって異なります。 Oracle では DROP ANY TABLE 権限が必要ですが、他のシステムではこの権限を特定のユーザーまたはロールに付与できる場合があります。
インデックス
Oracle の TRUNCATE は、使用できないインデックスを再度有効にします。 DELETE にはこの効果はありません。
外部キー
テーブルへのアクティブな外部キー参照がある場合、TRUNCATE は実行できません。 DELETE の動作は、外部キーの構成によって異なります。
トリガー
DDL トリガーは TRUNCATE 操作によってアクティブ化できますが、DML トリガーは起動されません。
リモート実行
Oracle では、データベース リンクを介して TRUNCATE を実行できません。
ID 列
SQL*Server では、TRUNCATE は IDENTITY 列のシーケンスをリセットしますが、DELETE はリセットしません。
以上がSQL の TRUNCATE と DELETE: いつどちらを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。