ここでは、TRUNCATEの構文、パラメーター、および例を紹介します。
説明
TRUNCATEは、一連のテーブルからすべての行をすばやく削除します。 これは、各テーブルに対する無修飾のDELETEと同じ効果を有するが、実際にはテーブルをスキャンしないので、より高速である。 さらに、後続のVACUUM操作を必要とするのではなく、すぐにディスクスペースを回収します。 これは大きなテーブルで最も便利です。
概要
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
[RESTART IDENTITY | 継続的なID] [ CASCADE | RESTRICT ] パラメーター
name: 切り捨てるテーブルの名前 (スキーマ修飾) 。 テーブル名の前にONLYを指定した場合、そのテーブルのみが切り捨てられます。ONLYが指定されていない場合、テーブルとそのすべての子孫テーブル (存在する場合) は切り捨てられます。 必要に応じて、テーブル名の後に*を指定して、子孫テーブルが含まれることを明示的に示すことができます。RESTART IDENTITY: 切り捨てられたテーブルの列が所有するシーケンスを自動的に再起動します。CONTINUE IDENTITY: シーケンスの値を変更しないでください。 この値がデフォルトです。CASCADE: 名前付きテーブル、またはCASCADEのためにグループに追加されたテーブルへの外部キー参照を持つすべてのテーブルを自動的に切り捨てます。RESTRICT: コマンドにリストされていないテーブルからの外部キー参照がある場合は、切り捨てを拒否します。 この値がデフォルトです。
注
テーブルを切り捨てるには、テーブルに対するTRUNCATE特権が必要です。
TRUNCATEは、操作する各テーブルのACCESS EXCLUSIVEロックを取得します。これにより、テーブルに対する他のすべての同時操作がブロックされます。 RESTART IDENTITYが指定されている場合、再起動されるシーケンスも同様に排他的にロックされます。 テーブルへの同時アクセスが必要な場合は、代わりにDELETEコマンドを使用する必要があります。
TRUNCATEは、他のテーブルからの外部キー参照を持つテーブルでは使用できません。 このような場合に有効性を確認するには、テーブルスキャンが必要であり、要点は1つではありません。 CASCADEオプションを使用すると、すべての依存テーブルを自動的に含めることができますが、このオプションを使用する場合は非常に注意してください。そうしないと、意図していないデータが失われる可能性があります。 特に、切り捨てられるテーブルがパーティションである場合、兄弟パーティションは変更されないままになりますが、すべての参照テーブルとすべてのパーティションにカスケード接続が発生します。
TRUNCATEは、テーブルに存在する可能性のあるON DELETEトリガーを起動しません。 しかし、それはTRUNCATEトリガーで発射されます。 いずれかのテーブルに対してON TRUNCATEトリガーが定義されている場合、すべてのBEFORE TRUNCATEトリガーは切り捨てが発生する前に起動され、すべてのAFTER TRUNCATEトリガーは最後の切り捨てが実行されてシーケンスがリセットされた後に起動されます。 トリガーは、テーブルが処理される順序で起動します (最初にコマンドにリストされたもの、次にカスケードのために追加されたもの) 。
TRUNCATEはMVCCセーフではありません。 切り捨てが発生する前に取得されたスナップショットを使用している場合、同時トランザクションに対してテーブルは空のように表示されます。
TRUNCATEは、テーブル内のデータに関してトランザクションセーフです。周囲のトランザクションがコミットされない場合、切り捨ては安全にロールバックされます。
RESTART IDENTITYが指定されている場合、暗黙のALTER SEQUENCE RESTART操作もトランザクション的に実行されます。つまり、周囲のトランザクションがコミットしない場合はロールバックされます。 トランザクションがロールバックする前に再開されたシーケンスで追加のシーケンス操作が実行された場合、シーケンスに対するこれらの操作の影響はロールバックされますが、currval() への影響は返されません。つまり、トランザクションcurrval() の後は、失敗したトランザクション内で取得された最後のシーケンス値を反映し続けます。配列自体がもはやそれと一致していないかもしれませんが。 これは、トランザクションが失敗した後のcurrval() の通常の動作に似ています。
外部データラッパーでサポートされている場合、TRUNCATEは外部テーブルに使用できます。
例
bigtableとfattableのテーブルを切り捨てる:
TRUNCATE bigtable、fattable;同じで、関連するシーケンスジェネレータもリセットします。
TRUNCATE bigtable、fattable再起動アイデンティティ;テーブルothertableを切り捨て、外部キー制約を介してothertableを参照するテーブルにカスケードします。
TRUNCATE othertable CASCADE;