Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


13.1.33 TRUNCATE TABLE 構文

TRUNCATE [TABLE] tbl_name

TRUNCATE TABLE は、テーブルを完全に空にします。これには DROP 権限が必要です。

TRUNCATE TABLE は論理的に、すべての行を削除する DELETE ステートメントや、DROP TABLE および CREATE TABLE ステートメントのシーケンスに似ています。高性能を実現するために、データを削除するための DML の方法をバイパスします。そのため、ロールバックすることができず、ON DELETE トリガーが起動されることはなく、さらに親子の外部キー関係を持つ InnoDB テーブルに対して実行することもできません。

TRUNCATE TABLEDELETE に似ているにもかかわらず、DML ステートメントではなく DDL ステートメントとして分類されます。MySQL 5.6 では、DELETE とは次の点で異なります。

  • 切り捨て操作はテーブルを削除して再作成するため、特に大きなテーブルの場合は、行を 1 つずつ削除するよりはるかに高速です。

  • 切り捨て操作は暗黙的なコミットを発生させるため、ロールバックできません。

  • セッションがアクティブなテーブルロックを保持している場合は、切り詰め操作を実行できません。

  • TRUNCATE TABLE は、InnoDB テーブルに対して、このテーブルを参照するほかのテーブルからの何らかの FOREIGN KEY 制約が存在する場合は失敗します。同じテーブルのカラム間の外部キー制約が許可されます。

  • 切り詰め操作は、削除された行数に対して、意味のある値を返しません。通常の結果は0 rows affectedですが、これは情報がないものとして解釈してください。

  • テーブル形式ファイル tbl_name.frm が有効であるかぎり、データまたはインデックスファイルが破損した場合でも、TRUNCATE TABLE を使用してテーブルを空のテーブルとして再作成できます。

  • AUTO_INCREMENT 値はすべて、その開始値にリセットされます。これは、通常はシーケンス値を再利用しない MyISAMInnoDB にも当てはまります。

  • パーティション化されたテーブルで使用された場合、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「パフォーマンススキーマサマリーテーブル」を参照してください。


User Comments
  Posted by Yi Peng on August 29, 2010
On Windows, MySQL server 5.1 defaults to safe update mode, even though safe-updates is not enabled in my.ini (a bug possibly?). Truncating table results in error listed below.

Error: 1175 SQLSTATE: HY000 (ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE)
Message: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

I found that the easiest way to disable the safe mode is to execute this SQL statement first to disable safe update mode temporarily.

SET sql_safe_updates=0

Defaulting to safe update mode is not bad after all.

Sign Up Login You must be logged in to post a comment.