DROPとTRUNCATEの違い


8

TRUNCATEドロップする方法の違いは何ですか?

私はそれがテーブル内のすべてのデータを削除すると思いますが、テーブル名をデータベースに保持し、そこでDROPすべてのデータとテーブルを削除します。これは正しいです ?


関連(詳細のすべてが同じでなくても、おそらく多くの概念は類似または同一になるでしょう):dba.stackexchange.com/questions/30325/delete-vs-truncate
Aaron Bertrand

回答:


22

削除-データ操作言語(DML)

DELETERDBMS内のステートメントは、DMLステートメントと見なされます。CRUD(作成、読み取り、更新、削除)とも呼ばれるこの種のステートメントは、オブジェクトの基本構造に影響を与えずにデータベース内のデータを操作することを目的としています。これが実際に意味するところは:

  • DELETE声明は、のいずれかを介して述語を使用して微調整することができWHEREたりJOIN、テーブル内の一部またはすべての行を削除します。
  • DELETE文は、データベースによって記録され、文が失敗した場合、トランザクション内でロールバックすることができます。
  • 通常、a DELETEは削除されたデータに対して行レベルのロックをかけますが、これは必要に応じてさらに高くなる可能性があります。
  • トランザクションのオーバーヘッドのため、DELETE「遅い」(これは相対的なものです)可能性がありますが、粒度が細かいため安全です。

切り捨て-データ定義言語(DDL)

TRUCNATEDDLステートメントと見なされます。つまり、データベースでのオブジェクトの定義方法を変更することを目的としています。通常、DDL文はCREATEALTER、またはDROPが、TRUNCATEすべての行を削除することによって、テーブルを「resettting」のことを、特定の目的を果たします。この方法はRDBMSエンジン間で異なり、MySQL詳細を確認することをお勧めします。aの実際的な影響は次のTRUNCATEとおりです。

  • TRUNCATEきめの細かいことはできません。成功すると、テーブルからすべての行が削除されます。
  • TRUNCATE通常は記録されません。これはRDBMSによって異なりますが、MySQLがどのように処理するかをより具体的に確認することをお勧めします。(ヒント、バージョンによって異なります。)
  • TRUNCATE実行するには、テーブルメタデータロックが必要です。これが実際にどのように実装されるかはRDBMSに固有ですがTRUNCATE、DDLを実行するために、プロセスは基本的に他のプロセスがテーブルに干渉しないようにする必要があります。
  • (通常)ログに記録されず、述語を使用しないため、a TRUNCATEはよりも高速ですがDELETE、安全性は低くなります。

ドロップテーブル-データ定義言語(DDL)

DROP TABLETRUNCATE実際にデータベースからテーブルを完全に削除するという点でaよりもさらに進んでいます。これには、インデックスや制約など、関連するすべてのオブジェクトの削除が含まれます。テーブルを削除すると、すべてのデータが削除されるだけでなく、構造も削除されます。これは通常、テーブルが不要になったときに行われます。主な懸念事項は、a DROPはDDLであるため、通常は元に戻せないことです。一部のRDBMSエンジンでは、DDLをトランザクション内にラップしてロールバックできるようにしますが、これはベストプラクティスとは見なされず、回避する必要があります。


1
TRUNCATEがテーブルの自動インクリメントカウンターをリセットすることを追加します。
DanMan、2014年

5

MySQLについて話すことはできませんが、Oracleでの切り捨てと削除のいくつかの側面を比較した簡単な表を次に示します。

truncate                             |   delete
---------------------------------    |   ---------------------------
DDL   (implicitly commits,           |   DML
    including any pending DML)       |  
Does not generate undo info          |   Generates undo info
    (rollback statements)            |       (rollback statements)
Resets high water mark in table      |   Does not affect full-scan 
    and all indexes, improving       |       performance
    full-scan performance            |      
Does not fire any delete triggers    |   Fires delete triggers
Priv to truncate cannot be granted   |   --
    to truncate another user's       |  
    table; DROP ANY TABLE system     |   
    priv required                    |      
Storage for table and indexes can    |   Never shrinks the size of a 
    be set to initial size           |       table or indexes
Cannot truncate parent table from    |   --
    an established referential       |  
    integrity constraint; must       |  
    first disable foreign key        |  
    that references the parent       |  
    table                            |  

この本から編集された情報:http : //amzn.com/0470395125

うまくいけば、これは、私がしたように、このページを偶然見つけたすべてのOracleユーザーを助けるかもしれません。MySQLでこれらのポイントのうちどれが当てはまるかを指摘してください。


2

DROP TABLE TableName ->データベースからテーブルを削除します。

TRUNCATE TABLE TableName-> IDENTITYテーブルにIDENTITYフィールドがある場合は、無条件にテーブルのデータを削除し、シード値をリセットします。


1
  • DELETE:DMLコマンド、削除コマンドを実行すると、テーブル構造を破棄せずにDATAのみを削除すると、行ごとにデータをロールバックできます

  • TRUNCATE:DDLコマンド、Truncateコマンドを実行すると、テーブル構造を破棄せずにDATAのみを削除します。データを切り捨てることはできません。データを切り捨てます。

  • DROP:、DDLコマンド、DROPコマンドを実行すると、データとテーブル構造全体が削除(削除)されても、データをロールバックできません

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