TRUNCATE [TABLE] tbl_name
TRUNCATE
TABLE
はテーブルを完全に空にします。論理的には、これはすべての行を削除する
DELETE
ステートメントと同等ですが、いくつかの条件下では、違いがあります。
InnoDB
テーブルの場合、InnoDB
は、テーブルを参照するいずれかの
FOREIGN KEY
制約が存在する場合に行を 1
つずつ削除することによって
TRUNCATE
TABLE
を処理します。FOREIGN
KEY
制約が存在しない場合、InnoDB
は元のテーブルを削除し、同じ定義を持つ空のテーブルを作成することによって速い切り詰めを実行します。これは、1
行ずつ削除するよりはるかに高速です。AUTO_INCREMENT
カウンタは、FOREIGN KEY
制約が存在するかどうかには関係なく、TRUNCATE
TABLE
によってリセットます。
FOREIGN KEY
制約がテーブルを参照する場合、InnoDB
は行を 1
つずつ削除し、各行で制約を処理します。FOREIGN
KEY
制約で DELETE
CASCADE
が指定されている場合は、子
(参照されている)
テーブルからの行が削除され、切り詰められたテーブルは空になります。FOREIGN
KEY
制約で
CASCADE
が指定されていない場合、TRUNCATE
ステートメントは行を 1
つずつ削除し、子によって参照されている親行を検出すると停止して、次のエラーを返します。
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))
これは、WHERE
節が指定されていない
DELETE
ステートメントと同じです。
MySQL 5.1.32
からは、TRUNCATE
は、DROP TABLE
とそれに続く CREATE
TABLE
として (つまり、DML ではなく DDL
として)
バイナリログおよびレプリケーションの目的に処理されます。これは、トランザクション遮断レベルによってステートメントベースのロギング
(READ COMMITTED
または
READ UNCOMMITTED
)
が許可されていない
InnoDB
やその他のトランザクションストレージエンジンを使用している場合、STATEMENT
または MIXED
ロギングモードを使用しているときにステートメントがログおよび複製されなかったという事実によります。(Bug#36763) ただし、前に説明した方法で
InnoDB
を使用しているレプリケーションスレーブには引き続き適用されます。
TRUNCATE
TABLE
によって影響を受ける数行は、DELETE
ステートメントにマップされている場合にのみ正確です。
その他のストレージエンジンの場合、MySQL
5.1
では、TRUNCATE
TABLE
は次のように
DELETE
とは異なります。
切り詰め操作はテーブルを削除して再作成するため、特に大きなテーブルの場合は、行を 1 つずつ削除するよりはるかに高速です。
切り詰め操作は、暗黙的なコミットを引き起こします。
セッションがアクティブなテーブルロックを保持している場合は、切り詰め操作を実行できません。
切り詰め操作は、削除された行数に対して、意味のある値を返しません。通常の結果は 「0 rows affected」 ですが、これは「情報がない」ものとして解釈してください。
テーブルフォーマットファイル
が有効であるかぎり、データやインデックスファイルが破損しても、テーブルは
tbl_name
.frmTRUNCATETABLE
を利用して空のテーブルとして再作成することができます。
テーブルハンドラは最後に利用された
AUTO_INCREMENT
値を記憶していませんが、また最初から数えます。通常はシーケンス値を再利用しない
MyISAM
と
InnoDB
にも同じことが言えます。
パーティション化されたテーブルと共に利用されるときには、TRUNCATE
TABLE
はその分割を保管します。それは、パーティション定義
(.par
)
ファイルは影響を受けませんが、データとインデックスファイルはドロップされ、再作成されるという意味です。
テーブルの切捨てが
DELETE
を利用しないため、TRUNCATE
ステートメントは ON
DELETE
トリガーを呼び出しません。
MySQL 5.1.16
の時点では、TRUNCATE
TABLE
には
DROP
権限が必要です。(MySQL 5.1.16
より前のバージョンでは、DELETE
権限が必要です。)