ALTER TABLE ステートメントを実行して、テーブルを変更できます。親テーブルに加えられた変更は、子テーブルに自動的に適用されます。このトピックでは、ALTER TABLE ステートメントの使用方法について説明します。
制限
Hologres でテーブルを変更する場合は、次の項目に注意してください。
テーブルの名前変更、テーブルへの列の作成、テーブルの Time-To-Live(TTL)期間の変更を行うことができます。
列の DEFAULT 制約を設定できます。また、列の dictionary_encoding_columns プロパティと bitmap_columns プロパティを変更することもできます。
使用上の注意
dictionary_encoding_columns、bitmap_columns、time_to_live_in_seconds などのテーブルプロパティを変更すると、操作によってバックエンドで非同期にコンパクション操作が実行される可能性があります。これにより、CPU リソースが消費されます。また、操作によってインスタンスのストレージ容量が増加してから減少する可能性もあります。
データ型の変更
Hologres V3.0 以降では、内部テーブルの列のデータ型を変更できます。
制限
非パーティションテーブルとパーティション親テーブルの列のデータ型は変更できますが、パーティション子テーブルの列のデータ型は変更できません。
パーティション親テーブルのパーティションキー列のデータ型は変更できません。
COLLATE 構文と USING 構文はサポートされていません。
次の表に、サポートされているデータ型の変換を示します。
ソースデータ型
変換先データ型
説明
VARCHAR(N)
VARCHAR(M)
M は N より大きくなければなりません。
VARCHAR(N)
TEXT
なし。
CHAR(N)
CHAR(M)
M は N より大きくなければなりません。
CHAR(N)
VARCHAR(M)
M は N 以上でなければなりません。
CHAR(N)
TEXT
なし。
JSON
TEXT
なし。
VARCHAR(N)[]
VARCHAR(M)[]
M は N より大きくなければなりません。
VARCHAR(N)[]
TEXT[]
なし。
構文
ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER [ COLUMN ] <column_name> TYPE <data_type>;
例
DROP TABLE IF EXISTS t; CREATE TABLE IF NOT EXISTS t ( a varchar(5) ); INSERT INTO t VALUES ('holo'), ('gres'); ALTER TABLE IF EXISTS t ALTER COLUMN a TYPE text;
外部テーブルの名前変更
ALTER TABLE ステートメントを実行して、テーブルの名前を変更できます。テーブルが存在しない場合、または新しいテーブル名が既存のテーブルの名前と同じ場合は、エラーが返されます。
スキーマをまたいでテーブルの名前を変更することはできません。
構文
-- 内部テーブルの名前を変更します。 ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> RENAME TO <new_table_name>; -- 外部テーブルの名前を変更します。 ALTER FOREIGN TABLE [IF EXISTS] [<schema_name>.]<foreign_table_name> RENAME TO <new_foreign_table_name>;
例
-- public スキーマの holo_test 内部テーブルの名前を holo_test_1 に変更します。 ALTER TABLE IF EXISTS public.holo_test RENAME TO holo_test_1 ; -- public スキーマの foreign_holo_test 外部テーブルの名前を foreign_holo_test_1 に変更します。 ALTER FOREIGN TABLE IF EXISTS public.foreign_holo_test RENAME TO foreign_holo_test_1;
列の追加
ALTER TABLE ステートメントを実行して、テーブルの最後の列に続く列を追加できます。
構文
-- 単一の列を追加します。 ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ADD COLUMN <new_column> <data_type>; -- 複数の列を追加します。 ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ADD COLUMN <new_column_1> <data_type>, ADD COLUMN <new_column_2> <data_type>;
例
-- holo_test テーブルに id という名前の列を追加します。 ALTER TABLE IF EXISTS public.holo_test ADD COLUMN id int;
列の削除 (パブリックプレビュー)
Hologres V2.0 以降では、テーブルから列を削除できます。
制限
V2.0 以後の Hologres インスタンスのテーブルから列を削除できます。 Hologres インスタンスのバージョンが V2.0 より前の場合は、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加して Hologres テクニカルサポートに連絡してください。 Hologres コンソールで Hologres インスタンスを手動でアップグレードする方法については、「手動アップグレード (ベータ)」をご参照ください。テクニカルサポートを受ける方法については、「Hologres のオンラインサポートを受ける」をご参照ください。
テーブルがパーティションテーブルの場合、特定の子テーブルの列ではなく、親テーブルの列を削除するために ALTER TABLE ステートメントを使用できます。親テーブルから特定の列を削除するステートメントを実行すると、列は子テーブルから自動的に削除されます。列の削除はオーバーヘッドの高い操作です。オフピーク時にこの操作を実行することをお勧めします。
テーブルの列は、テーブルの所有者のみが削除できます。テーブルが存在するデータベースが Simple Permission Model(SPM)を使用している場合、アカウントを使用してテーブルから列を削除するには、アカウントに {db}_developer ロールが割り当てられている必要があります。
主キー、分散キー、クラスタリングキー、または Event_time_column プロパティで設定されている列は削除できません。
外部テーブルから列を削除することはできません。
JSONB データ型の列を削除すると、列に対して作成されたインデックスも削除されます。
proxima_vector 型の列を削除する場合は、
cascade
パラメーターを指定する必要があります。SERIAL データ型の列を削除すると、列に基づいて作成されたシーケンスも削除されます。
テーブルに対してマテリアライズドビューが作成されている場合、テーブル、またはテーブル内のマテリアライズドビューによって参照される列を削除することはできません。
構文
重要V2.0 より前のインスタンスの列は削除できません。
set hg_experimental_enable_drop_column = on; -- グローバルユーザー設定 (GUC) パラメーターを設定して、この機能を有効にします。 ALTER TABLE IF EXISTS <table_name> DROP COLUMN [ IF EXISTS ] <column> [ RESTRICT | CASCADE ]
例
-- テーブルを作成します。 begin; CREATE TABLE tbl ( "id" bigint NOT NULL, "name" text NOT NULL, "age" bigint, "class" text NOT NULL, "reg_timestamp" timestamptz NOT NULL, PRIMARY KEY (id,age) ); call set_table_property('tbl', 'orientation', 'column'); call set_table_property('tbl', 'distribution_key', 'id'); call set_table_property('tbl', 'clustering_key', 'age'); call set_table_property('tbl', 'event_time_column', 'reg_timestamp'); call set_table_property('tbl', 'bitmap_columns', 'name,class'); call set_table_property('tbl', 'dictionary_encoding_columns', 'class:auto'); commit; -- 指定した列を削除します。 set hg_experimental_enable_drop_column =on; -- この機能はパブリックプレビューです。機能を有効にするには、GUC パラメーターを設定します。 ALTER TABLE IF EXISTS tbl DROP COLUMN name;
テーブルからデータをクエリします。
SELECT*FROMtbl; -- 次の結果が返されます。 id age class reg_timestamp ----+-----+---------+--------------
列の名前変更
Hologres V1.1 以降では、テーブルの列の名前を変更できます。
Hologres インスタンスのバージョンが V1.1 より前の場合は、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加して Hologres テクニカルサポートに連絡してください。 Hologres コンソールで Hologres インスタンスを手動でアップグレードする方法については、「手動アップグレード (ベータ)」をご参照ください。テクニカルサポートを受ける方法については、「Hologres のオンラインサポートを受ける」をご参照ください。
テーブルがパーティションテーブルの場合、親テーブルとその子テーブルのデータ構造は一致している必要があります。この場合、親テーブルの列の名前のみを変更できます。子テーブルの列の名前は変更できません。子テーブルの列が親テーブルで使用されている場合、子テーブルの列の名前は親テーブルの列と一致するように自動的に変更されます。
異なるテーブルの列を一度に名前変更することはできません。
テーブルの列は、テーブルの所有者のみが名前変更できます。テーブルが存在するデータベースが SPM を使用している場合、アカウントを使用してテーブルの列の名前を変更するには、アカウントに {db}_developer ロールが割り当てられている必要があります。
構文
ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> RENAME COLUMN <old_column_name> TO <new_column_name>;
例
-- holo_test テーブルの id 列の名前を name に変更します。 ALTER TABLE IF EXISTS public.holo_test RENAME COLUMN id TO name;
列の DEFAULT 制約の設定
ALTER TABLE ステートメントを実行して、テーブルの列に DEFAULT 制約を設定できます。 DEFAULT 制約は、定数または定数式にすることができます。設定は、設定後に列に書き込まれたデータまたは列で更新されたデータにのみ有効になり、テーブルの列の既存のデータには影響しません。 Hologres V0.9.23 以降で作成されたテーブルの列に DEFAULT 制約を設定できます。このシナリオでは、ALTER TABLE ステートメントは次の構文を使用します。
構文
-- テーブルの列に DEFAULT 制約の値を指定します。 ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER COLUMN <column> SET DEFAULT <expression>; -- テーブルの列の DEFAULT 制約の値を削除します。 ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER COLUMN <column> DROP DEFAULT;
例
-- holo_test テーブルの id 列の DEFAULT 制約の値を 0 に指定します。 ALTER TABLE IF EXISTS holo_test ALTER COLUMN id SET DEFAULT 0; -- holo_test テーブルの id 列の DEFAULT 制約の値を削除します。 ALTER TABLE IF EXISTS holo_test ALTER COLUMN id DROP DEFAULT;
テーブルプロパティの変更
Hologres では、ALTER TABLE ステートメントの関連パラメーターを変更することで、テーブルプロパティを変更できます。次のテーブルプロパティを変更できます。
dictionary_encoding_columns ディクショナリエンコーディングプロパティを変更すると、データファイルが再エンコードされて保存されるため、CPU とメモリーリソースが消費されます。オフピーク時にディクショナリエンコーディングプロパティを変更することをお勧めします。
構文
-- dictionary_encoding_columns プロパティを変更します (Hologres V2.1 以降に適用可能)。 ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (dictionary_encoding_columns = '[columnName{:[on|off|auto]}[,...]]'); -- ディクショナリエンコーディングプロパティは、すべての列に対してのみ変更できます。 -- dictionary_encoding_columns プロパティを変更します (すべての Hologres バージョンに適用可能) -- すべての列のディクショナリエンコーディングプロパティを変更します。 CALL SET_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'dictionary_encoding_columns', '[columnName{:[on|off|auto]}[,...]]'); -- CALL ステートメントで指定した列のディクショナリエンコーディングプロパティのみを変更します。他の列のディクショナリエンコーディングプロパティは変更されません。 CALL UPDATE_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'dictionary_encoding_columns', '[columnName{:[on|off|auto]}[,...]]');
重要Hologres V2.0 以降では、UPDATE_TABLE_PROPERTY の構文が最適化されています。 最適化後、次の文の実行中にテーブルの
dictionary_encoding_columns
プロパティは変更されません。 Hologres V2.0 より前のバージョンでは、次の文の実行中にテーブルのdictionary_encoding_columns
プロパティはクリアされます。CALL UPDATE_TABLE_PROPERTY('<table_name>','dictionary_encoding_columns','');
パラメーターの説明
パラメーター
説明
table_name
プロパティを変更するテーブルの名前。テーブル名は大文字と小文字が区別され、スキーマ名を前に付けることができます。
on
列のディクショナリエンコーディングを有効にします。
off
列のディクショナリエンコーディングを無効にします。
auto
列のディクショナリエンコーディングを有効にするかどうかを指定します。このパラメーターを列に設定すると、Hologres は、この列の値の再帰に基づいて、列のディクショナリエンコーディングを有効にするかどうかを決定します。ディクショナリエンコーディングは、値の再帰率が高い列に適しています。 Hologres V0.8 以前では、TEXT データ型のすべての列に対してデフォルトでディクショナリエンコーディングが有効になっています。 Hologres V0.9 以降では、Hologres は列の値の特性に基づいて、列のディクショナリエンコーディングを有効にするかどうかを決定します。
例
列 a のディクショナリエンコーディングを有効にし、列 b のディクショナリエンコーディングを有効にするかどうかを Hologres が決定するように指定し、列 c と d のディクショナリエンコーディングは変更しません。
CREATE TABLE dwd.holo_test ( a text NOT NULL, b text NOT NULL, c text NOT NULL, d text ); CALL UPDATE_TABLE_PROPERTY('dwd.holo_test','dictionary_encoding_columns','a:on,b:auto');
列 a のディクショナリエンコーディングを無効にします。 Hologres は、列 b、c、および d のディクショナリエンコーディングを自動的に有効にします。
CREATE TABLE dwd.holo_test ( a text NOT NULL, b text NOT NULL, c text NOT NULL, d text ); CALL SET_TABLE_PROPERTY('dwd.holo_test','dictionary_encoding_columns','a:off');
bitmap_columns
Hologres V0.9 以降では、別のテーブルを作成せずに、テーブルの bitmap_columns プロパティを変更できます。
構文
-- bitmap_columns プロパティを変更します (Hologres V2.1 以降に適用可能)。 ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (bitmap_columns = '[columnName{:[on|off]}[,...]]'); -- bitmap_columns プロパティを変更します (すべての Hologres バージョンに適用可能)。 -- すべての列の bitmap_columns プロパティを変更します。 CALL SET_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'bitmap_columns', '[columnName{:[on|off]}[,...]]'); -- CALL ステートメントで指定した列の bitmap_columns プロパティのみを変更します。他の列のプロパティは変更されません。 CALL UPDATE_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'bitmap_columns', '[columnName{:[on|off]}[,...]]');
重要Hologres V2.0 以降では、UPDATE_TABLE_PROPERTY の構文が最適化されています。 最適化後、次の文の実行中にテーブルの列の
bitmap_columns
プロパティは変更されません。 Hologres V2.0 より前のバージョンでは、テーブルの列のbitmap_columns
プロパティはクリアされます。CALL UPDATE_TABLE_PROPERTY('<table_name>','bitmap_columns','');
パラメーターの説明
パラメーター
説明
table_name
プロパティを変更するテーブルの名前。テーブル名は大文字と小文字が区別され、スキーマ名を前に付けることができます。
on
フィールドのビットマップインデックスを作成します。
off
フィールドのビットマップインデックスを作成しません。
例
次のサンプルステートメントでは、a フィールドのビットマップインデックスが作成されます。 b、c、および d フィールドの bitmap_columns プロパティは変更されません。
CREATE TABLE dwd.holo_test ( a text NOT NULL, b text NOT NULL, c text NOT NULL, d text ); CALL UPDATE_TABLE_PROPERTY('dwd.holo_test','bitmap_columns','a:on');
次のサンプルステートメントでは、b フィールドのビットマップインデックスは作成されません。 Hologres は、a、c、および d フィールドのビットマップインデックスを作成します。
CREATE TABLE dwd.holo_test_1 ( a text NOT NULL, b text NOT NULL, c text NOT NULL, d text ); CALL SET_TABLE_PROPERTY('dwd.holo_test_1','bitmap_columns','b:off');
time_to_live_in_seconds プロパティ
構文
call set_table_property('[<schema_name>.]<table_name>', 'time_to_live_in_seconds', '<non_negative_literal>');
パラメーターの説明
パラメーター
説明
time_to_live_in_seconds
テーブル内のデータの TTL 期間 (秒単位)。値は正の整数でなければなりません。
説明Hologres テーブルの TTL 期間は、データが最初にテーブルに書き込まれた時点から開始されます。 TTL 期間が経過すると、テーブル内のデータは特定の時点ではなく、一定期間内に削除されます。
例
call set_table_property('dwd.holo_test', 'time_to_live_in_seconds', '600');
テーブルが存在するスキーマの変更
Hologres V1.3 以降では、テーブルが存在するスキーマを変更できます。たとえば、別のテーブルを作成せずに、schema1 から schema2 にテーブルを移動できます。このようにして、テーブルのパスをすばやく変更できます。
構文
ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET SCHEMA <new_schema>;
schema_name: テーブルが存在するスキーマの名前。table_name: 別のスキーマに移動するテーブルの名前。new_schema: テーブルの移動先スキーマの名前。
例
tb1 という名前のテーブルを public スキーマから testschema スキーマに移動します。
ALTER TABLE IF EXISTS public.tbl SET SCHEMA testschema;
HoloWeb コンソールでのテーブルの変更
HoloWeb では、視覚的にテーブルを変更できます。 SQL ステートメントを実行せずに、テーブルのフィールドとプロパティを変更できます。 HoloWeb コンソールでテーブルを変更するには、次の手順を実行します。
[holoweb コンソール] にログオンします。詳細については、「HoloWeb に接続してクエリを実行する」をご参照ください。
[holoweb コンソール] の上部ナビゲーションバーで、[メタデータ管理] をクリックします。
[メタデータ管理] タブの左側のナビゲーションペインで、[接続済みインスタンス] をクリックし、変更するテーブルをダブルクリックします。
テーブルの詳細タブで、テーブルのフィールドとプロパティを変更します。
右上隅の [送信] をクリックします。