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コマンドを使用しなければなりません。
そのテーブルが他のテーブルから外部キーで参照されている場合、TRUNCATEでそれらのテーブルをすべて空にするように指定していない限り、TRUNCATEを使用することはできません。
このような場合に有効性を検査するならばテーブルスキャンが必要になりますが、テーブルスキャンを行うのであれば、このコマンドの利点がなくなるからです。
CASCADEを使用して、自動的にすべての依存テーブルを含めることができます。
しかし、意図しないデータ損失の可能性がありますので、このオプションを使用する時には十分に注意してください。
TRUNCATEは、テーブルにON DELETEトリガがあっても、それを発行しません。
しかし、ON TRUNCATEトリガを発行します。
テーブルのいずれかにON TRUNCATEトリガが定義されている場合、何らかの消去が行われる前にすべてのBEFORE TRUNCATEトリガが発行されます。
また、最後の消去がなされ、シーケンスが初期化された後すべてのAFTER TRUNCATEトリガが発行されます。
トリガは処理されるテーブルの順番(コマンドに列挙されたものが先、その後にカスケードのために追加されたもの)に発行されます。
TRUNCATEはMVCC的に安全ではありません。
同時実行中のトランザクションが、削除の前に取得したスナップショットを使っている場合、削除の後、テーブルはそのトランザクションからは空に見えます。
(詳しくは第13章を参照してください。)
テーブル内のデータという観点では、TRUNCATEはトランザクション的に安全です。
前後のトランザクションがコミットされなければ消去は安全にロールバックされます。
RESTART IDENTITYが指定された場合、暗黙的にALTER SEQUENCE RESTART操作がトランザクション的に行われます。
つまりそれを囲むトランザクションがコミットされなければ、ロールバックされます。
これは通常のALTER SEQUENCE RESTARTとは異なる動作です。
トランザクションがロールバックされる前に、初期化したシーケンスに対してさらにシーケンス操作を行う場合には注意してください。
シーケンスに対するこれらの操作の影響はロールバックされますが、currval()への影響はロールバックされません。
つまりトランザクションの後、currval()は、シーケンス自体と値とが一貫性のない状態になっていたとしても、失敗したトランザクションの内側で得た最後のシーケンス値を継続して反映します。
これは、失敗したトランザクションの後のcurrval()の通常の動作と同じです。
現在のところ、TRUNCATEは外部テーブルに対してはサポートされません。
このため、指定のテーブルの子孫に外部テーブルがあった場合、コマンドは失敗します。
bigtableテーブルおよびfattableテーブルを空にします。
TRUNCATE bigtable, fattable;
以下も同じですが、ここでは関連するシーケンスジェネレータをすべてリセットします。
TRUNCATE bigtable, fattable RESTART IDENTITY;
othertableテーブル、および、外部キー制約によりothertableを参照するすべてのテーブルを空にします。
TRUNCATE othertable CASCADE;
標準SQL:2008には、TRUNCATE TABLE という構文のtablenameTRUNCATEコマンドが含まれます。
CONTINUE IDENTITY/RESTART IDENTITY句も標準に記載され、関連してはいるのですが、若干異なります。
標準では、このコマンドの同時実行に関する動作の一部は実装に依存するものとされています。
このため、上記注釈を検討し、必要に応じて他の実装と比べなければなりません。