[解決済み] SQLのTRUNCATEとDELETEの違いは何ですか?
質問
とはどう違うのですか?
TRUNCATE
と
DELETE
をSQLで表示できますか?
もしあなたの回答がプラットフォーム固有のものであれば、その旨を示してください。
解決方法は?
以下は、相違点の一覧です。Oracle固有の機能を強調しましたが、コミュニティが他のベンダーの固有の違いも追加してくれることを願っています。ほとんどのベンダーに共通する相違点は、見出しの下に直接記載し、相違点を下にハイライトしています。
全体概要
もし、あるテーブルから全ての行を素早く削除したい場合、そして、本当に削除したいのであれば、そして、そのテーブルに対して外部キーを持っていないのであれば、TRUNCATEはおそらくDELETEよりも高速になるでしょう。
以下に詳述するように、システム固有の様々な問題を考慮する必要がある。
ステートメントタイプ
DeleteはDML、TruncateはDDL( DDLとDMLとは何ですか? )
コミットとロールバック
ベンダ別変数
SQL*Server
Truncateはロールバックすることができます。
PostgreSQL
Truncateはロールバックすることができます。
オラクル
TRUNCATEはDDLであるため、文の実行前と実行後の2回のコミットを伴います。したがって、Truncateはロールバックすることができず、Truncate処理で失敗すると、いずれにせよコミットが発行されます。
ただし、以下のフラッシュバックを参照。
空間再生
削除では容量が回復しない、切り捨てでは容量が回復する
オラクル
REUSE STORAGE句を使用すると、データセグメントは割り当て解除されないので、テーブルにデータを再ロードする場合、わずかながら効率的になります。ハイウォーターマークはリセットされます。
行の範囲
Delete は、すべての行または一部の行を削除するために使用されます。Truncateは、すべての行を削除します。
オラクル
テーブルがパーティション化されている場合、各パーティションを個別に切り捨てることができるため、テーブルの全データの部分的な削除が可能です。
オブジェクトの種類
削除は、テーブルとクラスタ内のテーブルに適用できます。Truncateは、テーブルまたはクラスタ全体にのみ適用されます。(オラクル固有の場合がある)
データオブジェクトのアイデンティティ
オラクル
Deleteはデータ・オブジェクトIDに影響を与えませんが、truncateは新しいデータ・オブジェクトIDを割り当てます。 ただし テーブルが作成されてから一度も挿入されていない場合でも、挿入が一度でもロールバックされると、切り捨て時に新しいデータオブジェクトIDが割り当てられる。
フラッシュバック(オラクル)
フラッシュバックは削除の間でも機能しますが、トランケートによって操作前の状態へのフラッシュバックはできなくなります。
ただし、11gR2からはFLASHBACK ARCHIVE機能により、Express Editionを除き、これが可能になります。
オラクルにおけるFLASHBACKの使用 http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
特典
変数
オラクル
Deleteは他のユーザやロールにテーブル上で付与することができますが、truncateはDROP ANY TABLEの付与を使用しない限りはできません。
やり直し・元に戻す
Deleteは少量のRedoと大量のUndoを生成します。切り捨ては、それぞれごくわずかな量しか発生させません。
インデックス
オラクル
切り捨て操作は、使用不可能なインデックスを再び使用可能にします。削除はそうではありません。
外部キー
有効な外部キーがテーブルを参照している場合、切り捨てを適用することはできません。削除の扱いは、外部キーの設定に依存します。
テーブルロック
オラクル
切り捨てには排他的テーブルロックが必要で、削除には共有テーブルロックが必要です。したがって、テーブルロックを無効にすることは、テーブルに対する切り捨て操作を防止する方法です。
トリガー
DMLトリガーは切り捨てでは起動しません。
オラクル
DDLトリガーが使用可能です。
リモート実行
オラクル
データベースリンク上でTruncateを発行することはできません。
アイデンティティ・カラム
SQL*Server
Truncate は IDENTITY 列型のシーケンスをリセットし、delete はリセットしません。
結果セット
ほとんどの実装では
DELETE
文は、削除された行をクライアントに返すことができます。
例えば、Oracle PL/SQL のサブプログラムでは、次のようなことができます。
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
関連
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] SQL JOIN - WHERE句とON句の比較
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] VARCHARとCHARの違いは何ですか?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQLラーニングノート--オペランドには1つのカラムが必要です。
-
MySQL - ストアドプロシージャ (データ型、関数)
-
[解決済み] アドホッククエリとは何ですか?
-
[解決済み] テーブルネーミングのジレンマ:単数形と複数形の名前【非公開
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] SQL Serverには、.NETのMath.Maxのような2つの値を取るMax関数はありますか?
-
[解決済み] Postgres でサブクエリを使用してテーブルの行を更新する
-
[解決済み】DDLとDMLとは何ですか?