TRUNCATE ステートメント
TRUNCATE ステートメントは、表からすべての行を削除します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
ステートメントの許可 ID によって保持されている特権には、表、および表階層のすべての副表に対する以下の権限の少なくとも 1 つが含まれていなければなりません。
- 切り捨てる表に対する DELETE 特権
- 表が含まれるスキーマに対する DELETEIN 特権
- 切り捨てる表に対する CONTROL 特権
- 表が含まれるスキーマに対する DATAACCESS 権限
- DATAACCESS 権限
表に対して定義されているすべての DELETE トリガーを無視するには、ステートメントの許可 ID によって保持されている特権に、表、および表階層のすべての副表に対する以下の権限の少なくとも 1 つが含まれていなければなりません。
- 表に対する ALTER 特権
- 表および表階層のすべての副表が含まれるスキーマに対する ALTERIN 特権
- 表に対する CONTROL 特権
- 表および表階層のすべての副表が含まれるスキーマに対する SCHEMAADM 権限
- DBADM 権限
セキュリティー・ポリシーで保護されている表を切り捨てるには、ステートメントの許可 ID で保持されている特権に、以下の権限の少なくとも 1 つが含まれている必要があります。
- 表に対する CONTROL 特権
- DBADM 権限
行アクセス制御がアクティブになっている表を切り捨てるには、ステートメントの許可 ID に、以下の権限の少なくとも 1 つが含まれている必要があります。
- 表に対する CONTROL 特権
- DBADM 権限
構文
説明
- table-name
- 切り捨てる表を指定します。 この名前は、現行のサーバーに存在する表を指定するものでなければなりませんが (SQLSTATE 42704)、カタログ表 (SQLSTATE 42832)、ニックネーム (SQLSTATE 42809)、ビュー、副表、ステージング表、システムによって保守されるマテリアライズ照会表、システム期間テンポラル表 (SQLSTATE 428HZ)、および範囲がクラスター化された表 (SQLSTATE 42807) を指定することはできません。
table-name が表階層のルート表である場合は、表階層内のすべての表が切り捨てられます。
- DROP STORAGE または REUSE STORAGE
- 表に割り振られている既存のストレージをドロップするか、再利用するかを指定します。 デフォルトは DROP STORAGE です。
- DROP STORAGE
- 表に割り振られているすべてのストレージが解放され、使用可能になります。 このオプションが (暗黙的または明示的に) 指定された場合、オンライン・バックアップはブロックされます。
- REUSE STORAGE
- 表に割り振られているすべてのストレージは、その表に引き続き割り振られますが、ストレージは空と見なされます。 このオプションは、DMS 表スペース内の表にのみ適用でき、それ以外は無視されます。
- IGNORE DELETE TRIGGERS または RESTRICT WHEN DELETE TRIGGERS
- 表に対して DELETE トリガーが定義されている場合に実行する動作を指定します。 デフォルトは IGNORE DELETE TRIGGERS です。
- IGNORE DELETE TRIGGERS
- 表に対して定義されている DELETE トリガーは、切り捨て操作によってアクティブにされません。
- RESTRICT WHEN DELETE TRIGGERS
- 表に対して DELETE トリガーが定義されている場合はエラーが戻されます (SQLSTATE 428GJ)。
- CONTINUE IDENTITY
- 表に ID 列が存在する場合、生成される次の ID 列の値は、TRUNCATE ステートメントが実行されなかった場合に生成される次の値に進みます。
- IMMEDIATE
- 切り捨て操作が直ちに処理され、取り消しできないことを指定します。 ステートメントは、トランザクション内の最初のステートメントである必要があります (SQLSTATE 25001)。
切り捨てられた表は、同じ作業単位で使用できるように直ちに使用可能になります。 ROLLBACK ステートメントは、TRUNCATE ステートメントの実行後に実行できますが、切り捨て操作は取り消されず、表は、切り捨てられた状態のままになります。 例えば、TRUNCATE IMMEDIATE ステートメントの実行後に表に対して別のデータ変更操作が実行され、その後で ROLLBACK ステートメントが実行された場合、切り捨て操作は取り消されませんが、その他のデータ変更操作はすべて取り消されます。
ルール
- 参照整合性: 参照制約が適用される場合、表、および表階層内のすべての表は、親表であってはなりません (SQLSTATE 428GJ)。 自己参照 RI 制約は許可されます。
- パーティション表: 表は、データ・パーティションをアタッチするように変更されているので、SET INTEGRITY ペンディング状態であってはなりません (SQLSTATE 55019)。 TRUNCATE ステートメントを実行する前に、表の整合性チェックを実施する必要があります。 論理的にデタッチされたパーティションが表にあってはなりません (SQLSTATE 55057)。 非同期パーティション・デタッチ・タスクは、TRUNCATE ステートメントの実行前に完了していなければなりません。
- アクセスの排他: 他のセッションは、表に対してカーソルを開いたり、表に対してロックを掛けたりすることはできません (SQLSTATE 25001)。
- WITH HOLD カーソル: 現行セッションは、表に対して WITH HOLD カーソルを開くことはできません (SQLSTATE 25001)。
注
- 表統計: 表の統計は TRUNCATE ステートメントによって変更されません。
- 削除された行数: SQLCA の SQLERRD(3) は、切り捨て操作の場合は -1 に設定されます。 表から削除された行数は戻されません。
- カラム・オーガナイズ表では、IMMEDIATE 節が任意指定である場合、IMMEDIATE 節に以下の規則が適用されます。
- IMMEDIATE オプションを指定しなかった場合、TRUNCATE ステートメントが処理され、その処理を元に戻すことができます。
- TRUNCATE ステートメントは、トランザクション・スコープ内のどこにでも配置できます。
- TRUNCATE ステートメントは、トランザクションが完了する前に元に戻すことができます。
- 切り捨てられた表を、同じ作業単位ですぐに使用することができます。
- ROLLBACK ステートメントは、IMMEDIATE オプションを指定していない TRUNCATE ステートメントが処理された後で実行できます。 その後 TRUNCATE 操作が元に戻されます。
- 例えば、IMMEDIATE オプションを指定していない TRUNCATE ステートメントが処理された後で、表に対して別のデータ変更操作が実行され、その後 ROLLBACK ステートメントが実行された場合は、TRUNCATE 操作も元に戻されます。
- トランザクションが完了すると、ストレージは自動的に非同期で再利用されます。
- 切り捨て操作は、一括削除操作に似た方法で実行されます。 表から削除された行の数は、SQLERRD(4) で返されます。
- 基礎となる DELETE ステートメントに WHERE 節が含まれていないため、SQLWARN(5) の値は「W」です。
例
- 例 1: 既存のトリガーにかかわらず未使用の在庫表を空にして、その割り振られていたスペースを戻します。
TRUNCATE TABLE INVENTORY IGNORE DELETE TRIGGERS DROP STORAGE IMMEDIATE
- 例 2: 既存の DELETE トリガーにかかわらず未使用の在庫表を空にしますが、後で再使用できるように、その割り振られていたスペースを保持します。
TRUNCATE TABLE INVENTORY REUSE STORAGE IGNORE DELETE TRIGGERS IMMEDIATE
- 例 3: カラム・オーガナイズ表に IMMEDIATE が指定されていない場合、TRUNCATE ステートメントを作業単位の最初のステートメントにする必要はなく、ROLLBACK ステートメントを使用して切り捨て操作を元に戻すことができます。
IMMEDIATE を指定していない TRUNCATE ステートメントは作業単位の最初のステートメントではないことと、IMMEDIATE を指定していない TRUNCATE ステートメントはロールバックできることに注目してください。SELECT COUNT(*) FROM TAB10; TRUNCATE TABLE TAB10; SELECT COUNT(*) FROM TAB10; ROLLBACK;