web-dev-qa-db-ja.com

DROPとTRUNCATEの違い

ドロップするためにTRUNCATEはどのように違うのですか?

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

8
user1829823

DELETE-データ操作言語(DML)

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

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

TRUNCATE-データ定義言語(DDL)

TRUCNATE[〜#〜] ddl [〜#〜] ステートメントと見なされます。つまり、データベースでのオブジェクトの定義方法を変更することを目的としています。通常、DDLステートメントはCREATEALTER、またはDROPですが、TRUNCATEは特定の目的を果たします。つまり、すべての行。この方法はRDBMSエンジン間で異なります MySQLの詳細 を確認することをお勧めします。 TRUNCATEの実際的な影響は次のとおりです。

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

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

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

22
Mike Fal

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でこれらのポイントのうちどれが当てはまるかを指摘してください。

5
MollyOQ

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

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

2
Reha Ozenc
  • DELETE:DMLコマンド、削除コマンドを実行すると、テーブル構造を破棄せずにDATAのみを削除し、データを行ごとにROLLBACKできます。

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

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

1
Sanjeev Reddy