TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE
は、テーブルを完全に空にします。これには DROP
権限が必要です。
TRUNCATE TABLE
は論理的に、すべての行を削除する DELETE
ステートメントや、DROP TABLE
および CREATE TABLE
ステートメントのシーケンスに似ています。高性能を実現するために、データを削除するための DML の方法をバイパスします。そのため、ロールバックすることができず、ON DELETE
トリガーが起動されることはなく、さらに親子の外部キー関係を持つ InnoDB
テーブルに対して実行することもできません。
TRUNCATE TABLE
は DELETE
に似ているにもかかわらず、DML ステートメントではなく DDL ステートメントとして分類されます。MySQL 5.6 では、DELETE
とは次の点で異なります。
切り捨て操作はテーブルを削除して再作成するため、特に大きなテーブルの場合は、行を 1 つずつ削除するよりはるかに高速です。
切り捨て操作は暗黙的なコミットを発生させるため、ロールバックできません。
セッションがアクティブなテーブルロックを保持している場合は、切り詰め操作を実行できません。
TRUNCATE TABLE
は、InnoDB
テーブルに対して、このテーブルを参照するほかのテーブルからの何らかのFOREIGN KEY
制約が存在する場合は失敗します。同じテーブルのカラム間の外部キー制約が許可されます。切り詰め操作は、削除された行数に対して、意味のある値を返しません。通常の結果は「0 rows affected」ですが、これは「情報がない」ものとして解釈してください。
テーブル形式ファイル
が有効であるかぎり、データまたはインデックスファイルが破損した場合でも、tbl_name
.frmTRUNCATE TABLE
を使用してテーブルを空のテーブルとして再作成できます。AUTO_INCREMENT
値はすべて、その開始値にリセットされます。これは、通常はシーケンス値を再利用しないMyISAM
やInnoDB
にも当てはまります。パーティション化されたテーブルで使用された場合、
TRUNCATE TABLE
はそのパーティション化を保持します。つまり、データおよびインデックスファイルが削除されて再作成されるのに対して、パーティション定義 (.par
) ファイルは影響を受けません。TRUNCATE TABLE
ステートメントは、ON DELETE
トリガーを起動しません。
テーブルに対する TRUNCATE TABLE
は、HANDLER OPEN
で開かれたそのテーブルのすべてのハンドラを閉じます。
TRUNCATE TABLE
は、バイナリロギングおよびレプリケーション目的のときは、DROP TABLE
とそれに続く CREATE TABLE
として、つまり、DML ではなく DDL として扱われます。これは、InnoDB
またはほかのトランザクションストレージエンジン (そのトランザクション分離レベルがステートメントベースロギングを許可しない (READ COMMITTED
または READ UNCOMMITTED
)) を使用するときは、STATEMENT
または MIXED
ロギングモード使用時にステートメントがログに記録されず複製されなかった事実によります。(Bug #36763) ただし、InnoDB
を使用するレプリケーションスレーブには依然としてすでに説明した方法で適用されます。
TRUNCATE TABLE
はパフォーマンススキーマのサマリーテーブルで使用できますが、その効果は行の削除ではなく、サマリーカラムを 0 または NULL
にリセットすることです。セクション22.9.9「パフォーマンススキーマサマリーテーブル」を参照してください。