ドロップするためにTRUNCATE
はどのように違うのですか?
私はそれがテーブルのすべてのデータを削除すると思いますが、DROP
はすべてのデータとテーブルを削除するので、データベースにテーブル名を保持します。これは正しいです ?
DELETE-データ操作言語(DML)
RDBMSのDELETE
ステートメントは [〜#〜] dml [〜#〜] ステートメントと見なされます。 CRUD(作成、読み取り、更新、削除)とも呼ばれるこの種のステートメントは、オブジェクトの基本構造に影響を与えずにデータベース内のデータを操作することを目的としています。これが実際に意味するところは:
DELETE
ステートメントは、WHERE
またはJOIN
のいずれかを介して述語を使用して微調整し、テーブル内の一部またはすべての行を削除できます。DELETE
ステートメントはデータベースによって記録され、ステートメントが失敗した場合はトランザクション内でロールバックできます。DELETE
は、削除されたデータに対して行レベルのロックをかけますが、これは必要に応じてさらに高くなる可能性があります。DELETE
は「遅い」可能性があります(これは相対的です)が、粒度が細かいため、より安全です。TRUNCATE-データ定義言語(DDL)
TRUCNATE
は [〜#〜] ddl [〜#〜] ステートメントと見なされます。つまり、データベースでのオブジェクトの定義方法を変更することを目的としています。通常、DDLステートメントはCREATE
、ALTER
、またはDROP
ですが、TRUNCATE
は特定の目的を果たします。つまり、すべての行。この方法はRDBMSエンジン間で異なります MySQLの詳細 を確認することをお勧めします。 TRUNCATE
の実際的な影響は次のとおりです。
TRUNCATE
を細かくすることはできません。成功すると、テーブルからすべての行が削除されます。TRUNCATE
は通常、ログに記録されません。これはRDBMSによって異なりますが、MySQLがどのように処理するかをより具体的に確認することをお勧めします。 (ヒント、バージョンによって異なります。)TRUNCATE
を実行するには、テーブルメタデータロックが必要です。これが実際にどのように実装されるかはRDBMSに固有ですが、基本的にTRUNCATE
プロセスは、DDLを実行するために、他のプロセスがテーブルに干渉しないようにする必要があります。TRUNCATE
はDELETE
より高速ですが、安全性は低くなります。ドロップテーブル-データ定義言語(DDL)
DROP TABLE
は、実際にデータベースからテーブルを完全に削除するという点でTRUNCATE
よりも進んでいます。これには、インデックスや制約など、関連するすべてのオブジェクトの削除が含まれます。テーブルを削除すると、すべてのデータが削除されるだけでなく、構造も削除されます。これは通常、テーブルが不要になったときに行われます。主な関心事は、DROP
がDDLであるため、 通常は元に戻すことはできません です。一部のRDBMSエンジンでは、トランザクション内でDDLをラップしてロールバックできるようにしますが、これはベストプラクティスとは見なされず、回避する必要があります。
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でこれらのポイントのうちどれが当てはまるかを指摘してください。
DROP TABLE TableName
->データベースからテーブルを削除します。
TRUNCATE TABLE TableName
->テーブルにIDENTITY
フィールドがある場合は、無条件にテーブルのデータを削除し、IDENTITY
シード値をリセットします。
DELETE
:DMLコマンド、削除コマンドを実行すると、テーブル構造を破棄せずにDATAのみを削除し、データを行ごとにROLLBACKできます。
TRUNCATE
:DDLコマンド、Truncateコマンドを実行すると、テーブル構造を破棄せずにDATAのみを削除します。データを切り捨てることはできません。データを切り捨てます。
DROP
:、 DDLコマンド、DROPコマンドを実行すると、そのデータを削除(削除)し、テーブル構造全体もデータをロールバックできません。