SQLのTRUNCATEとDELETEの違いは何ですか


303

違いは何TRUNCATEDELETE SQLでは?

回答がプラットフォーム固有の場合は、それを示してください。


4
答えはすべてプラットフォーム固有です。標準SQLにはTRUNCATEコマンドはありません。したがって、これは独自の機能であり、DBMSベンダーごとに異なることを意味します。
nvogel

sqlvogelが指摘しているように、これは非標準のコマンド(TRUNCATE)であるため、答えは、実装固有のものです。この「オラクル」というタグを付けたままにするか、コミュニティウィキスタイルの回答にして、主要な各RDBMS(Oracle、MS-MSQL、PostgreSQLはすべてTRUNCATE ...を実装)に結果を入れます
reedstrm

トランザクションが完了した場合、つまりCOMMITEDの場合、TRUNCATEコマンドをロールバックすることはできませんが、LOGファイルからDELETEコマンドをロールバックすることはできます。DELETEは、将来LOGファイルからロールバックする必要がある場合に備えて、ログファイルに記録するためです。

回答:


272

ここに違いのリストがあります。オラクル固有の機能を強調しましたが、コミュニティが他のベンダー固有の違いを追加できることを願っています。ほとんどのベンダーに共通する違いは、見出しのすぐ下にあり、違いは以下で強調表示されています。


総括

テーブルからすべての行をすばやく削除する必要があり、本当に削除したいと確信していて、テーブルに対する外部キーがない場合、TRUNCATEはおそらくDELETEよりも高速になります。 。

以下に詳述するように、システム固有のさまざまな問題を考慮する必要があります。


ステートメントタイプ

削除はDML、切り捨てはDDL(DDLとDMLとは何ですか?


コミットとロールバック

ベンダーにより変動

SQLサーバー

切り捨てはロールバックできます。

PostgreSQL

切り捨てはロールバックできます。

オラクル

TRUNCATEはDDLであるため、ステートメント実行の前と後の2つのコミットが含まれます。したがって、truncateをロールバックすることはできず、truncateプロセスでの障害により、いずれにしてもコミットが発行されます。

ただし、以下のフラッシュバックを参照してください。


宇宙開発

削除してもスペースは回復しませんが、切り捨てるとスペースが回復します

オラクル

REUSE STORAGE句を使用する場合、データセグメントの割り当ては解除されません。これは、テーブルにデータを再ロードする場合、効率がわずかに向上する可能性があります。最高水位標がリセットされます。


行スコープ

Deleteを使用して、すべての行または行のサブセットのみを削除できます。Truncateはすべての行を削除します。

オラクル

テーブルがパーティション分割されている場合、個々のパーティションを個別に切り捨てることができるため、テーブルのすべてのデータを部分的に削除できます。


オブジェクトタイプ

削除は、テーブルおよびクラスター内のテーブルに適用できます。Truncateは、テーブルまたはクラスター全体にのみ適用されます。(Oracle固有の場合があります)


データオブジェクトID

オラクル

削除はデータオブジェクトIDに影響を与えませんが、テーブルの作成以降、テーブルに対する挿入がない場合を除いて、truncate は新しいデータオブジェクトIDを割り当てます。 。


フラッシュバック(Oracle)

フラッシュバックは削除全体で機能しますが、切り捨てにより、操作前の状態にフラッシュバックできなくなります。

ただし、11gR2からは、FLASHBACK ARCHIVE機能でこれが可能になります(Express Editionを除く)。

OracleでのFLASHBACKの使用 http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


特権

変数

オラクル

テーブルでの削除は別のユーザーまたはロールに付与できますが、DROP ANY TABLE付与を使用せずに切り捨てることはできません。


やり直し/元に戻す

削除は、少量のやり直しと大量の取り消しを生成します。Truncateはそれぞれの生成量を無視できます。


インデックス

オラクル

切り捨て操作により、使用できないインデックスが再び使用可能になります。削除はしません。


外部キー

有効な外部キーがテーブルを参照する場合、切り捨ては適用できません。削除による処理は、外部キーの構成によって異なります。


テーブルのロック

オラクル

Truncateは排他的なテーブルロックを必要とし、deleteは共有テーブルロックを必要とします。したがって、テーブルロックを無効にすることは、テーブルでの切り捨て操作を防ぐ方法です。


トリガー

DMLトリガーは切り捨てでは起動しません。

オラクル

DDLトリガーを使用できます。


リモート実行

オラクル

Truncateはデータベースリンクを介して発行できません。


ID列

SQLサーバー

TruncateはIDENTITY列タイプのシーケンスをリセットしますが、削除はリセットしません。


結果セット

ほとんどの実装では、 DELETEステートメントはクライアントに削除された行を返すことができます。

たとえば、Oracle PL / SQLサブプログラムでは、次のことができます。

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

4番目のステートメントを理解できません。DELETE[ ] FROM Tableと言った場合次に、FKが停止しない限り、そのテーブルの*すべての行が削除されます。ちなみに、これはSQL Server固有のものだと思います。FKを含むテーブルでTRUNCATEを使用することはできません。
ジョー・ピネダ

さらにコメント:オラクル固有でない限り、私はあなたの3番目のステートメントに同意しません。少なくともSQL Sでは、特に要求しない限り、DELETEまたはTRUNCATEを実行しても、領域は回復しません(つまり、データベースファイルはハードドライブで圧縮されません)。
ジョー・ピネダ

1
5番目のステートメント:SQL 2008 r2でTRUNCATE TABLEをロールバックできます
Eric Labashosky 2010

1
PostgresqlはTRUNCATEをロールバックできるため、それを自動コミットしません。
rfusca

5
DELETEは削除された行数を返しますが、TRUNCATEは返しません。それは非常にばかげたポイントですが、言及する価値があります:)
Deepak Kumar Jha 2015年

191

切り捨てと削除の違いを以下に示します。

+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate.                              |                                              |
|                                        |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+

テーブルのリセットIDを切り捨てるどういう意味ですか?しかし、削除はどうですか?
ラビ

1
@jWeaver:主キーフィールドのID仕様プロパティをTrueに設定すると、そのテーブルにデータを挿入すると、主キー列に1、2、3、4、5などの値が保持されます(IDが開始した場合)から1でシードは1)であり、テーブルを切り捨てるとすべてのID値が失われるため、データをそのテーブルに再度挿入し始めると、最後に残っている場所ではなく1から始まります。DELETEでは、その逆です。DELETEステートメントを実行した後でも、ID値は保持されます。上の画像のDELETE列の2番目の比較ポイントの誤りで申し訳ありません。
Bhaumik Patel

SQL SERVER
Ravi

4
TRUNCATEとDELETEの両方をSQL SERVERでロールバックできます。また、2行目のDELETEはIDをリセットしません。この投稿をどのように編集できますか?StackOverflowで画像を使用することの悪い点です。
Mahmood Jenami 2016

2
切り捨てがロールバックされています!(SQL SERVER)
Aimal Khan

55

落とす

DROPコマンドは、データベースからテーブルを削除します。テーブルのすべての行、インデックス、特権も削除されます。DMLトリガーは発生しません。操作はロールバックできません。

切り捨て

TRUNCATEは、テーブルからすべての行を削除します。操作はロールバックできず、トリガーは発生しません。そのため、TRUNCATEの方が高速で、DELETEほど多くの取り消しスペースを使用しません。切り捨て時にテーブルレベルのロックが追加されます。

削除

DELETEコマンドは、テーブルから行を削除するために使用されます。WHERE句は、一部の行のみを削除するために使用できます。WHERE条件が指定されていない場合、すべての行が削除されます。DELETE操作を実行した後、トランザクションをCOMMITまたはROLLBACKして、変更を永続的にするか、元に戻す必要があります。この操作により、テーブルのすべてのDELETEトリガーが起動することに注意してください。削除すると、行レベルのロックが追加されます。

送信元:http : //www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


5
私のような初心者のための素晴らしい説明
Vikas Kukreti

短くて甘い
ABH

23

私が追加しなければならないすべての良い答え:

以来TRUNCATE TABLEDDL(あるデータDefination言語)ではなく、DML(データ操作のlangauge)コマンド、Delete Triggers実行しないでください。


ああ、トリガー...それは良い点です。それを私が作ったリストに追加して、それが問題なければ、Polaraにクレジットします。
David Aldridge

SQL Serverでは、外部キーを使用してテーブルを切り捨てることができないため、プラットフォームによっては、カスケードポイントが問題になる場合があります。
2008

PostgreSQLには「TRUNCATE Trigger」があります
a_horse_with_no_name


17

SQL ServerまたはMySQLでは、自動インクリメントのPKがある場合、truncateはカウンターをリセットします。


明確にするために、IDENTITYとして定義された列がテーブルにある場合、これはSQL Server用です。削除は、最後に自動割り当てされたIDを維持しますが、トランケートはカウンターをリセットします。
Codewerks 2008

質問にはORACLEのタグが付いているため、この回答は誤っているため、反対票が投じられます。
Guy

おっと、oracleタグが表示されませんでした:)
mathieu

+1 true、それを0にリセットします。代わりに1にしたい場合:DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB

これをコミュニティの回答に追加し、ベンダー固有の問題を文書化するために少し
わかりやすくし

12

「切り捨ては何も記録しません」は正しいです。私はさらに行きます:

トランケートはトランザクションのコンテキストでは実行されません。

削除よりも切り捨ての速度の利点は明らかです。その利点は、状況に応じて、些細なものから巨大なものまでさまざまです。

ただし、切り詰めによって参照整合性が意図せず壊れ、他の制約に違反することもありました。トランザクションなしでデータを変更することによって得られる力は、ネットなしで綱渡りをするときに継承する責任とバランスを取る必要があります。


7

TRUNCATEはDDLステートメントDELETEですが、DMLステートメントです。2つの違いは次のとおりです。

  1. 以下のようTRUNCATEDDL(あるデータ定義言語)文でそれは永久的な変更を加えるためにコミットする必要はありません。そして、これが、truncateによって削除された行をロールバックできなかった理由です。一方DELETE、DML(データ操作言語)ステートメントは、その効果を永続的にするために明示的なコミットを必要とします。

  2. TRUNCATE常にテーブルからすべての行を削除し、テーブルを空にしてテーブル構造をそのままにしますDELETEが、where句を使用すると条件付きで削除される場合があります。

  3. TRUNCATE TABLEステートメントによって削除された行は復元できず、TRUNCATEステートメントでwhere句を指定できません。

  4. TRUNCATEステートメントは、DELETEステートメントの削除トリガーではなくトリガーを起動しません

これは、トピックに関連する非常に優れたリンクです。


6

はい、DELETEは低速で、TRUNCATEは高速です。どうして?

DELETEは、レコードの読み取り、制約のチェック、ブロックの更新、インデックスの更新、およびやり直し/取り消しの生成を行う必要があります。そのすべてに時間がかかります。

TRUNCATEは、データベースのポインターをテーブル(最高水準点)に合わせて調整するだけです。データはなくなりました。

これはOracle固有のAFAIKです。


PostgreSQLも同様です。
ギャビンM.ロイ

6

切り捨て

TRUNCATE SQLクエリは、個々の行の削除をログに記録せずに、テーブルからすべての行を削除します。

  • TRUNCATEはDDLコマンドです。
  • TRUNCATEはテーブルロックを使用して実行され、すべてのレコードを削除するためにテーブル全体がロックされます。
  • TRUNCATEでWHERE句を使用することはできません。
  • TRUNCATEは、テーブルからすべての行を削除します。
  • トランザクションログへのログ記録が最小限なので、パフォーマンスが向上します。
  • TRUNCATE TABLEは、テーブルデータの格納に使用されるデータページの割り当てを解除することでデータを削除し、ページの割り当て解除のみをトランザクションログに記録します。
  • テーブルでTruncateを使用するには、少なくともテーブルに対するALTER権限が必要です。
  • Truncateは、Deleteステートメントよりも少ないトランザクション領域を使用します。
  • Truncateはインデックス付きビューでは使用できません。
  • TRUNCATEはDELETEより高速です。

削除

DELETEキューを実行するには、ターゲットテーブルに対する削除権限が必要です。DELETEでWHERE句を使用する必要がある場合は、選択権限も必要です。

  • DELETEはDMLコマンドです。
  • DELETEは行ロックを使用して実行され、テーブル内の各行は削除のためにロックされます。
  • DELETEでwhere句を使用して、特定のレコードをフィルタリングおよび削除できます。
  • DELETEコマンドは、WHERE条件に基づいてテーブルから行を削除するために使用されます。
  • ログを維持するため、TRUNCATEよりも遅くなります。
  • DELETEステートメントは、一度に1行ずつ削除し、削除された各行のエントリをトランザクションログに記録します。
  • 列のIDの保持DELETEはIDを保持します。
  • Deleteを使用するには、テーブルに対するDELETEパーミッションが必要です。
  • Deleteは、Truncateステートメントよりも多くのトランザクションスペースを使用します。
  • 削除はインデックス付きビューで使用できます。

5

誤って削除/切り捨てを使用してテーブルからすべてのデータを削除した場合。コミットされたトランザクションをロールバックできます。最後のバックアップを復元し、削除/切り捨てが発生する直前までトランザクションログを実行します。

以下の関連情報はブログ投稿からのものです。

データベースで作業している間、それらの違いを知らずに削除と切り捨てを使用しています。この記事では、SQLでの削除と切り捨ての違いについて説明します。

削除:

  • 削除はDMLコマンドです。
  • Deleteステートメントは行ロックを使用して実行され、テーブル内の各行は削除のためにロックされます。
  • where句でフィルターを指定できます。
  • 条件が存在する場合、指定されたデータを削除します。
  • 操作は個別にログに記録されるため、アクティビティをトリガーとして削除します。
  • ログを保持するため、Truncateよりも遅い

切り捨て

  • TruncateはDDLコマンドです。
  • テーブルを切り捨てると、テーブルとページは常にロックされますが、各行はロックされません。すべてのデータが削除されるためです。
  • Where条件は使用できません。
  • すべてのデータを削除します。
  • この操作では個々の行の削除がログに記録されないため、テーブルをトランケートしてもトリガーをアクティブにできません。
  • ログを保持しないため、パフォーマンスが向上します。

注:トランザクションで使用すると、削除と切り捨ての両方をロールバックできます。トランザクションが完了した場合は、コミットされたことを意味します。Truncateコマンドをロールバックすることはできませんが、ログファイルから削除コマンドをロールバックすることは可能です。

切り詰めようとしているテーブルを参照している外部キー制約がある場合、参照しているテーブルにデータがない場合でも、これは機能しません。これは、外部キーのチェックがDMLではなくDDLで行われるためです。これは、テーブルへの外部キー制約を一時的に無効にすることで回避できます。

テーブルの削除はログに記録された操作です。そのため、各行の削除がトランザクションログに記録されるため、処理が遅くなります。テーブルを切り捨てると、テーブル内のすべての行も削除されますが、各行の削除はログに記録されず、テーブルのデータページの割り当て解除がログに記録されるため、処理が速くなります。

〜誤って削除/切り捨てを使用してテーブルからすべてのデータを削除した場合。コミットされたトランザクションをロールバックできます。最後のバックアップを復元し、削除/切り捨てが発生する直前までトランザクションログを実行します。


1
@ルーカスに感謝:彼はコンテンツをインライン化しました。異なるソースからのものであることを明らかにするために、ブロッククォートに入れました。
AstroCB 2014

4

SQL Server 2005では、切り捨てロールバックできると思います


4

削除

DELETEコマンドは、テーブルから行を削除するために使用されます。WHERE句は、一部の行のみを削除するために使用できます。WHERE条件が指定されていない場合、すべての行が削除されます。DELETE操作を実行した後、トランザクションをCOMMITまたはROLLBACKして、変更を永続的にするか、元に戻す必要があります。この操作により、テーブルのすべてのDELETEトリガーが起動することに注意してください。

切り捨て

TRUNCATEは、テーブルからすべての行を削除します。操作はロールバックできず、トリガーは発生しません。そのため、TRUCATEの方が高速で、DELETEほど多くの取り消しスペースを使用しません。

落とす

DROPコマンドは、データベースからテーブルを削除します。テーブルのすべての行、インデックス、特権も削除されます。DMLトリガーは発生しません。操作はロールバックできません。


DROPとTRUNCATEはDDLコマンドですが、DELETEはDMLコマンドです。したがって、DELETE操作はロールバック(元に戻す)できますが、DROPおよびTRUNCATE操作はロールバックできません。

送信元:http : //www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


これは現在の回答に何かを追加しますか?
David Aldridge

3

トランザクションにラップされている場合、TRUNCATEをロールバックできます。

以下の2つのリファレンスを参照して、自分でテストしてください。

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATEとDELETEは、SQLインタビューで悪名高い質問の1つです。面接担当者に適切に説明してください。そうしないと、仕事にコストがかかる可能性があります。問題は、多くの人が気づいていないことです。そのため、YES Truncateをロールバックできると伝えた場合、答えが間違っていると考えられる可能性が高くなります。


2

元の回答に対する小さな修正-削除もかなりの量のREDOを生成します(UNDO自体がREDOによって保護されているため)。これは、autotraceの出力から確認できます。

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed

古いスレッドですが、私の理解によれば、トランケートではかなりの量のREDOログしか生成されませんが、削除すると元に戻すとやり直しの両方が生成されます。
Saurabh Sinha

2

SQL ServerでのDELETEとTRUNCATEの違いに関する詳細な答えは次のとおりです

データの削除 :最初に、両方を使用してテーブルから行を削除できます。
ただし、DELETEを使用して、テーブルからだけでなく、ビューから、またはプロバイダー機能の対象となるOPENROWSETまたはOPENQUERYの結果からも行を削除できます。

FROM句:DELETEを使用すると、別のFROM句を使用して、別のテーブルの行に基づいて、1つのテーブル/ビュー/ rowset_function_limitedから行を削除することもできます。そのFROM句では、通常のJOIN条件を記述することもできます。実際には、SELECTをDELETEに置き換えて列名を削除することで、集計関数を含まないSELECTステートメントからDELETEステートメントを作成できます。
TRUNCATEを使用すると、それを行うことはできません。

WHERE:TRUNCATEにはWHERE条件を含めることはできませんが、DELETEには含めることができます。つまり、TRUNCATEでは、特定の行または行の特定のグループを削除することはできません。TRUNCATE TABLEは、WHERE句のないDELETEステートメントに似ています。

パフォーマンス:TRUNCATE TABLEの方が高速で、システムおよびトランザクションログリソースの使用量が少ない。そして、その理由の1つは、いずれかのステートメントで使用されるロックです。DELETEステートメントは行ロックを使用して実行され、テーブル内の各行は削除のためにロックされます。TRUNCATE TABLEは常にテーブルとページをロックしますが、各行はロックしません。

トランザクションログ:DELETEステートメントは、一度に1行ずつ削除し、各行のトランザクションログに個別のエントリを作成します。
TRUNCATE TABLEは、テーブルデータの格納に使用されるデータページの割り当てを解除することでデータを削除し、ページの割り当て解除のみをトランザクションログに記録します。

ページ:DELETEステートメントの実行後も、テーブルに空のページが含まれることがあります。TRUNCATEは、テーブルデータの格納に使用されるデータページの割り当てを解除することにより、データを削除します。

トリガー:TRUNCATEはテーブルの削除トリガーをアクティブにしません。したがって、TRUNCATEを使用するときは十分に注意する必要があります。テーブルで削除トリガーが定義されている場合は、行が削除されたときに自動クリーンアップまたはロギングアクションを実行する場合、TRUNCATEを使用しないでください。

ID列:テーブルにID列が含まれている場合、TRUNCATEを使用すると、その列のカウンターが列に定義されているシード値にリセットされます。シードが定義されていない場合、デフォルト値1が使用されます。DELETEはIDカウンターをリセットしません。したがって、IDカウンターを保持する場合は、代わりにDELETEを使用してください。

レプリケーション:DELETEは、トランザクションレプリケーションまたはマージレプリケーションで使用されるテーブルに対して使用できます。
TRUNCATEは、トランザクションレプリケーションまたはマージレプリケーションに関係するテーブルに対しては使用できません。

ロールバック:DELETEステートメントはロールバックできます。
TRUNCATEは、TRANSACTIONブロックで囲まれ、セッションが閉じられていない場合は、ロールバックすることもできます。セッションを閉じると、TRUNCATEをロールバックできなくなります。

制限:DELETEステートメントは、トリガーに違反したり、FOREIGN KEY制約のある別のテーブルのデータによって参照されている行を削除しようとしたりすると失敗する可能性があります。DELETEが複数の行を削除し、削除された行のいずれかがトリガーまたは制約に違反している場合、ステートメントはキャンセルされ、エラーが返され、行は削除されません。
また、DELETEがViewに対して使用される場合、そのViewは更新可能なビューでなければなりません。インデックス付きビューで使用されているテーブルに対してTRUNCATEを使用することはできません。
TRUNCATEは、それ自体を参照する外部キーを持つテーブルを除いて、FOREIGN KEY制約によって参照されるテーブルに対して使用できません。


こんにちはMangal-答え、特にSQL * Server固有の問題に感謝します。これらのポイントを、受け入れられたコミュニティWikiの回答と統合できると思いますか?
David Aldridge、2015年

はい、確かですが、どのように、どこで?申し訳ありません、私はここに新しいです。
Mangal Pardeshi、2015年

「そのため、IDカウンターを保持したい場合は、DELETEを使用してください」DECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag

1

最大の違いは、削除の場合は切り捨てがログに記録されない操作であることです。

つまり、データベースがクラッシュした場合、truncateによって操作されたデータを回復することはできませんが、削除すると回復できます。

詳細はこちら


1

DELETEステートメント:このコマンドは、where句で指定された条件に基づいてテーブルから行のみを削除するか、条件が指定されていない場合はテーブルからすべての行を削除します。ただし、テーブルを含むスペースは解放されません。

SQL DELETEステートメントの構文は次のとおりです。

DELETE FROM table_name [WHERE条件];

TRUNCATEステートメント:このコマンドは、テーブルからすべての行を削除し、テーブルを含むスペースを解放するために使用されます。


1

削除

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax  Delete from [Table] where [Condition]

切り捨て

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax  Truncate table [Table]

詳細はこちらをご覧ください

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/


1

2つの操作のもう1つの違いは、テーブルにID列が含まれている場合、その列のカウンターがTRUNCATEで1(または列に定義されたシード値)にリセットされることです。DELETEにはこの影響はありません。


0

つまり、truncateは何もログに記録しません(そのため、はるかに高速ですが、元に戻すことはできません)が、deleteはログに記録されます(より大きなトランザクションの一部である可能性があり、ロールバックなど)。不要なデータがdevのテーブルにある場合は、トランザクションログがいっぱいになるリスクを負わないため、通常は切り捨てることをお勧めします


0

それが便利な大きな理由は、数百万行のテーブルのデータを更新する必要があるが、それを再構築したくない場合です。「削除*」は永久にかかりますが、トランケートのパフォーマンスへの影響は無視できます。


0

dblinkではDDLを実行できません。


0

matthieuの投稿にコメントしますが、まだ担当者がいません...

MySQLでは、自動インクリメントカウンターは切り捨てでリセットされますが、削除ではリセットされません。


0

truncateがSQL Serverに何も記録しないわけではありません。truncateは情報をログに記録しませんが、TRUNCATEを実行したテーブルのデータページの割り当て解除をログに記録します。

トランザクションを最初に定義すると、切り捨てられたレコードはロールバックされ、ロールバック後に切り捨てられたレコードを回復できます。ただし、切り捨てられたトランザクションをコミットした後、トランザクションログバックアップから切り捨てられたレコードを回復することはできません。



0

SQLでの切り捨てと削除は、テーブルからデータを削除または削除するために使用される2つのコマンドです。本質的には非常に基本的ですが、両方のSQLコマンドは、使用する前に詳細に慣れるまで多くの問題を引き起こす可能性があります。削除する必要のあるデータが多すぎてログセグメントが十分でない場合、コマンドの選択を誤ると、プロセスが非常に遅くなるか、ログセグメントが破壊される可能性があります。そのため、SQLで切り捨てコマンドと削除コマンドをいつ使用するかを知ることが重要ですが、これらを使用する前に、TruncateとDeleteの違いに注意し、それらに基づいて、DELETEが削除のためのより良いオプションである場合を見つけることができるはずです。テーブルをパージするには、データまたはTRUNCATEを使用する必要があります。

ここをクリックしてチェックを参照してください


0

TRUNCATE TABLEステートメントを発行することにより、ロギングやトランザクション処理を行わずに、テーブル内のすべてのレコードを削除するようにSQL Serverに指示しています。


0

DELETEステートメントはWHERE句を使用して特定のレコードを削除できますが、TRUNCATEステートメントは何も必要とせず、テーブル全体をワイプします。重要なことに、DELETEステートメントは削除された日付をログに記録しますが、TRUNCATEステートメントはログに記録しません。


0

Microsoft SQL Serverに固有のもう1つの違いは、ステートメントをdelete使用outputして、どのレコードが削除されたかを追跡できることです。次に例を示します。

delete from [SomeTable]
output deleted.Id, deleted.Name

でこれを行うことはできませんtruncate

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.