このトピックでは、ALTER PARTITION TABLE ステートメントを実行してパーティションテーブルを変更する方法について説明します。
構文
Hologres でパーティションテーブルを変更するには、次のいずれかのステートメントを実行します。
ALTER TABLE [IF EXISTS] table_name RENAME to new_table_name;
ALTER TABLE [IF EXISTS] table_name ATTACH PARTITION new_partition_name FOR VALUES in (<string_literal>);
ALTER TABLE [IF EXISTS] table_name DETACH PARTITION paritition_name;パラメーター
次の表は、パーティションテーブルの変更に使用する ALTER PARTITION TABLE ステートメントのパラメーターについて説明しています。
| パラメーター | 説明 |
RENAME | パーティションテーブルの名前を変更する句。 |
ATTACH PARTITION new_partition_name FOR VALUES in (<string_literal>) | テーブルをパーティションとしてパーティションテーブルにアタッチする句。次のルールに注意してください。
|
DETACH PARTITION partition_name | 指定したパーティションをパーティションテーブルからデタッチする句。 デタッチされたパーティションはスタンドアロンテーブルとして存在しますが、デタッチ元のテーブルとの関連付けはなくなります。 |
制限
- 次のリストと表は、子テーブルが親テーブルにアタッチされるときに適用されるプロパティ設定のルールについて説明しています。
- 親テーブルと一致している必要があります:子テーブルのプロパティは、親テーブルのプロパティと一致している必要があります。そうでない場合、子テーブルを親テーブルにアタッチするとエラーが報告され、別の子テーブルを作成する必要があります。
- 親テーブルと一致する必要はありません:子テーブルのプロパティは、親テーブルのプロパティと異なる場合があります。子テーブルのプロパティが明示的に指定されていない場合、子テーブルは親テーブルの対応するプロパティ設定を継承します。子テーブルのプロパティが明示的に指定されている場合、子テーブルのプロパティ設定は保持されます。
- 親テーブルのインデックス付き列を含める必要があります:子テーブルのインデックス付き列には、親テーブルのインデックス付き列を含める必要があります。親テーブルのインデックス付き列として指定されていない列は、子テーブルに対して明示的に指定できます。
カテゴリ テーブルプロパティ 説明 CREATE TABLE PARTITION OF ステートメントを実行して作成された子テーブルが、親テーブルからプロパティ設定を継承するかどうか 子テーブルが親テーブルにアタッチされるときに適用されるルール 親テーブルからデタッチされた子テーブルが、親テーブルからプロパティ設定を継承するかどうか テーブルプロパティ orientation テーブルのストレージ形式。 はい 親テーブルと一致している必要があります はい table_group テーブルが属するテーブルグループ。このプロパティは、テーブルグループのシャード数も指定します。 はい 親テーブルと一致している必要があります はい time_to_live_in_seconds テーブルの有効期限 (TTL) 期間。 はい 親テーブルと一致する必要はありません - このプロパティが子テーブルに指定されていない場合、子テーブルは親テーブルからプロパティ設定を継承します。
- このプロパティが子テーブルに指定されている場合、指定されたプロパティ設定は保持されます。
はい インデックス プライマリキー テーブルのプライマリキー。 はい 親テーブルと一致している必要があります はい distribution key テーブルの分散キー。 はい 親テーブルと一致している必要があります はい clustering_key テーブルのクラスター化インデックス。このプロパティは、テーブルにデータが格納される列と順序を指定します。 はい 親テーブルと一致している必要があります はい event_time_column テーブルのセグメントキー。 はい 親テーブルと一致している必要があります はい bitmap_columns テーブルのビットマップインデックス。 はい 親テーブルのインデックス付き列を含める必要があります はい dictionary_encoding_columns テーブルのフィールドインデックス。 はい 親テーブルのインデックス付き列を含める必要があります はい binlog_level バイナリロギングを有効にするかどうかを指定します。 はい 親テーブルと一致している必要があります はい proxima_vectors テーブルでベクトル検索を実行するために使用されるインデックス。 はい 親テーブルのインデックス付き列を含める必要があります はい 列制約 nullable NOT NULL 制約。 はい 親テーブルと一致している必要があります はい デフォルト値 デフォルト値の制約。 はい 親テーブルと一致している必要があります はい - アタッチするテーブルのフィールド数は、パーティションテーブルと同じである必要があります。
- フィールドのデータ型は一致する必要があります。
例
次のサンプルコードは、ALTER PARTITION TABLE ステートメントを実行してパーティションテーブルを変更する方法の例を示しています。
-- パーティションテーブルの名前を変更します。
alter table holo_test rename to my_holo_test;
-- my_table という名前のテーブルを、holo_table という名前のテーブルのパーティションとしてアタッチします。
alter table holo_table attach partition my_table for values in ('2015');
-- 子パーティションテーブル holo_test を親パーティションテーブル all_test からデタッチし、子パーティションテーブルをスタンドアロンテーブルにします。
alter table all_test detach partition holo_test;
次のサンプルコードは、既存の子パーティションテーブルを置き換える方法の例を示しています。
-- 一時テーブルを作成します。
begin;
drop table if exists "table_20210101_new";
CREATE TABLE "table_20210101_new" (
"colA" integer NOT NULL,
"colB" text NOT NULL,
"colC" numeric(38,10) NOT NULL,
"ds" text NOT NULL,
"process_time" timestamptz NOT NULL DEFAULT now()
);
call set_table_property('table_20210101_new', 'orientation','column');
call set_table_property('table_20210101_new', 'distribution_key','"colA"');
call set_table_property('table_20210101_new', 'event_time_column','process_time');
commit;
--- 一時テーブルにデータをインポートします。
insert into "table_20210101_new" select * from ...;
--- 既存の子パーティションテーブルを一時テーブルに置き換えます。
begin;
-- 既存の子パーティションテーブルを親パーティションテーブルからデタッチし、子パーティションテーブルをスタンドアロンテーブルにします。
ALTER TABLE table_parent DETACH PARTITION table_20210101;
-- スタンドアロンテーブルの名前を変更します。
ALTER TABLE table_20210101 RENAME to table_20210101_backup;
-- 一時テーブルを元の子パーティションテーブルと同じ名前に変更します。
ALTER TABLE table_20210101_new RENAME to table_20210101;
-- 新しい子パーティションテーブルを親パーティションテーブルにアタッチします。
ALTER TABLE table_parent ATTACH PARTITION table_20210101 FOR VALUES in ("20210101");
commit;