すべてのプロダクト
Search
ドキュメントセンター

PolarDB:パーティションテーブルへのテーブルのアタッチまたはパーティションのデタッチ

最終更新日:May 30, 2024

PolarDB for PostgreSQL (Compatible with Oracle) では、アタッチおよびデタッチメント操作に使用される構文は、PostgreSQLの構文と完全に互換性があります。 このトピックでは、構文について説明し、サンプルステートメントを提供します。

概要

  • 添付: 既存のテーブルを、そのパーティションテーブルのパーティションとしてパーティションテーブルに添付します。

  • デタッチメント: パーティションテーブルからパーティションをデタッチして、パーティションを独立したテーブルに変換します。 デタッチ操作は、データを削除せずにパーティションテーブルからデータを削除する場合に使用できます。

構文

添付ファイル

ALTER TABLE [ IF EXISTS] 名
    ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | デフォルト} 

ステートメントでは、既存のテーブル (パーティションテーブルとすることができます) がパーティションテーブルにアタッチされ、そのテーブルのパーティションになります。 FOR VALUES句を使用して宛先パーティションを指定するか、DEFAULTを使用してデフォルトのパーティションにすることができます。

このプロセスでは、ターゲットテーブル内の各パーティションに対して、対応するインデックスがアタッチされたテーブルに対して作成されます。 インデックスが既に存在する場合、ALTER index ATTACH PARTITIONコマンドが実行されるかのように、インデックスは宛先テーブルのインデックスにアタッチされます。

説明

アタッチされたテーブルが外部テーブルであり、ターゲットテーブルに一意のインデックスがある場合、テーブルをパーティション分割テーブルにアタッチできません。

デタッチメント

ALTER TABLE [ IF EXISTS] 名
    DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ] 

ステートメントは、指定されたパーティションをテーブルから切り離します。 デタッチされたパーティションは独立したテーブルになり、以前の親テーブルには関連付けられなくなります。 この操作は、次の変更にもつながります。

  • パーティションに関連付けられたすべてのインデックスもデタッチされます。

  • 親テーブルのトリガーから複製されたすべてのトリガーが削除されます。

  • 外部キーを介してパーティションを参照するすべてのテーブルは、共有ロックを取得します。 例えば、パーティション化テーブルAが外部キーを介してパーティションBを参照すると仮定する。 パーティションB_p1がパーティションテーブルBからデタッチされると、パーティションテーブルaは共有ロックを取得する。

ステートメントでは、CONCURRENTLYまたはFINALIZEも指定できます。

  • CONCURRENTLYが指定されている場合、デタッチ操作は、パーティション分割テーブル上の他のトランザクションのブロックを回避するために、低レベルロックで実行されます。

    2つのトランザクションが作成されます。

    • 最初のトランザクションでは、親テーブルに対してSHARE UPDATE EXCLUSIVEロックが有効になり、パーティションはアタッチされているものとしてタグ付けされます。 このトランザクションはコミットされており、パーティションテーブルを使用する他のすべてのトランザクションは一時停止されます。

    • トランザクションが完了した後、第2のトランザクションは、パーティショニングされたテーブル上のSHARE UPDATE EXCLUSIVEロックおよびパーティション上のACCESS EXCLUSIVEロックを取得する。 取り外しプロセスは完了です。 パーティション制約と同じチェック制約がパーティションに追加されます。

    説明

    トランザクションブロックでは使用できません。 さらに、パーティションテーブルにデフォルトパーティションが含まれている場合、CONCURRENTLYは使用できません。

  • FINALIZEが使用される場合、以前にキャンセルまたは中断されたDETACH CONCURRENTLYコールが完了します。

添付ファイル

cities_partdefという名前のテーブルは、デフォルトのパーティションとしてcitiesという名前のパーティションテーブルにアタッチされます。

ALTERテーブル都市
    ATTACH PARTITION cities_partdef DEFAULT; 

デタッチメント

measurement_y2015m12という名前のパーティションは、measurementという名前のパーティションテーブルから切り離され、独立したテーブルになります。

ALTERテーブル測定
    DETACH PARTITION measurement_y2015m12;