無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

TRUNCATE

名前

TRUNCATE -- 1テーブルまたはテーブル群を空にする

概要

TRUNCATE [ TABLE ] [ ONLY ] 

name

 [ * ] [, ... ]
    [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

説明

TRUNCATE はテーブル群から全ての行を素早く削除します。 各テーブルに対して条件指定のない DELETE コマンドの実行と同じ効果を持ちますが、実際にテーブルを走査しない分、このコマンドの方が高速です。 さらに、その後に VACUUM 操作を行うことなく、このコマンドはディスク領域を即座に回収します。 このコマンドは、大きなテーブルを対象とする場合に最も有用です。

パラメータ

name

空にするテーブルの名前です(スキーマ修飾名も可)。 テーブル名の前に ONLY が指定されている場合、そのテーブルのみを空にします。 ONLY が指定されていない場合、そのテーブルとそのすべての子テーブル(もしあれば)を空にします。 省略することもできますが、テーブル名の後に * を指定することで、明示的に継承するテーブルも含まれることを示すことができます。

RESTART IDENTITY

消去されるテーブルの列により所有されるシーケンスを自動的に再起動させます。

CONTINUE IDENTITY

シーケンスの値を変更しません。これがデフォルトです。

CASCADE

指定されたテーブル、または、 CASCADE により削除対象テーブルとされたテーブルを参照する外部キーを持つテーブルすべてを自動的に空にします。

RESTRICT

外部キーにより対象のテーブルを参照するテーブルのいずれかがこのコマンドで指定されていない場合、操作を拒否します。 これがデフォルトです。

注釈

テーブルを空にするためにはそのテーブルに TRUNCATE 権限を持たなければなりません。

TRUNCATE は操作対象の各テーブルに対する ACCESS EXCLUSIVE を獲得します。 これは、この他のそのテーブルに対する同時操作をすべてブロックします。 RESTART IDENTITY が指定された場合、初期化対象のシーケンスがあると、それは同様に排他ロックされます。 テーブルへの同時アクセスが必要ならば、代わりに DELETE コマンドを使用しなければなりません。

そのテーブルが他のテーブルから外部キーで参照されている場合、1つの TRUNCATE でそれらのテーブルをすべて空にするように指定していない限り、 TRUNCATE を使用することはできません。 このような場合は、有効性を検査するためにテーブルスキャンが必要になりますが、テーブルスキャンを行うのであれば、このコマンドの利点がなくなるからです。 CASCADE を使用して、自動的にすべての依存テーブルを含めることができます。 しかし、意図しないデータ損失の可能性がありますので、このオプションを使用する時には十分に注意してください。

TRUNCATE は、テーブルに存在するすべての ON DELETE トリガを発行しません。 しかし、 ON TRUNCATE トリガを発行します。 テーブルのいずれかに ON TRUNCATE トリガが定義されている場合、何らかの消去が行われる前にすべての BEFORE TRUNCATE トリガが発行されます。 また、最後の消去がなされ、シーケンスが初期化された後すべての AFTER TRUNCATE トリガが発行されます。 トリガは処理されるテーブルの順番(コマンドに列挙されたものが先、その後にカスケードのために追加されたもの)に発行されます。

警告

TRUNCATE はMVCC的に安全ではありません。 (MVCCに関する一般的な情報については 第13章 を参照してください。) 削除の後テーブルはすべてのトランザクションから見て、たとえそのトランザクションが始まる前のスナップショットを使用していたとしても、空になります。 削除が始まる前にテーブルを参照しなかったトランザクションに関してのみ問題となります。 そうしたトランザクションでは少なくとも ACCESS SHARE ロックを保持しますので、そのトランザクションが終わるまで TRUNCATE はブロックされます。 このため、トランザクションでは、同一テーブルに対する後の問い合わせにおいてその内容に明らかな矛盾は発生しませんが、削除されたテーブルと他のテーブルとの間の内容に目に見える矛盾が発生します。

テーブル内のデータという観点では、 TRUNCATE はトランザクション的に安全です。 前後のトランザクションがコミットされなければ消去は安全にロールバックされます。

RESTART IDENTITY が指定された場合、暗黙的に ALTER SEQUENCE RESTART 操作がトランザクション的に安全に行われます。 つまりそれを囲むトランザクションがコミットされなければ、ロールバックされます。 これは通常の ALTER SEQUENCE RESTART とは異なる動作です。 トランザクションがロールバックされる前に、初期化したシーケンスに対してさらにシーケンス操作を行う場合には注意してください。 シーケンスに対するこれらの操作の影響はロールバックされますが、 currval() への影響はロールバックされません。 つまりトランザクションの後、 currval() は、シーケンス自体と値とが一貫性のない状態になっていたとしても、失敗したトランザクションの内側で得た最後のシーケンス値を継続して反映します。 これは、失敗したトランザクションの後の currval() の通常の動作と同じです。

bigtable テーブルおよび fattable テーブルを空にします。

TRUNCATE bigtable, fattable;

以下も同じですが、ここでは関連するシーケンスジェネレータをすべてリセットします。

TRUNCATE bigtable, fattable RESTART IDENTITY;

othertable テーブル、および、外部キー制約により othertable を参照するすべてのテーブルを空にします。

TRUNCATE othertable CASCADE;

互換性

標準SQL:2008には、 TRUNCATE TABLE tablename という構文の TRUNCATE コマンドが含まれます。 CONTINUE IDENTITY / RESTART IDENTITY 句も標準に記載され、関連してはいるのですが、若干異なります。 標準では、このコマンドの同時実行に関する動作の一部は実装に依存するものとされています。 このため、上記注意を検討し、必要に応じて他の実装と比べなければなりません。


powered by SEO.CUG.NET