`ALTER TABLE` 文はテーブルを変更します。パーティションテーブルの親テーブルへの変更は、その子テーブルに自動的に適用されます。このトピックでは、`ALTER TABLE` 文の使用方法について説明します。
制限事項
Hologres は、次のテーブル変更をサポートしています。
-
テーブル名の変更、列の追加、テーブルデータの存続時間 (TTL) の変更。
-
フィールドのデフォルト値、および `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>; -
例
-- holo_test テーブルの名前を holo_test_1 に変更 ALTER TABLE IF EXISTS public.holo_test RENAME TO holo_test_1 ; -- 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 以降、列を削除できます。構文は次のとおりです。
-
制限事項
-
この機能は Hologres V2.0 以降でのみ利用可能です。ご利用のインスタンスが V2.0 より前のバージョンの場合は、「アップグレード準備時の一般的なエラー」をご参照いただくか、Hologres DingTalk グループに参加してフィードバックをお寄せください。詳細については、「オンラインサポートの追加入手方法」をご参照ください。
-
パーティションテーブルを使用する場合、列は親テーブルからのみ削除でき、子テーブルから直接削除することはできません。親テーブルから列が削除されると、その子テーブルからも自動的に削除されます。この操作はオーバーヘッドが高いため、オフピーク時に実行することを推奨します。
-
テーブルのオーナーのみが列を削除できます。データベースで簡易権限モデルを使用している場合は、開発者ユーザーグループの権限が必要です。
-
プライマリキー、ディストリビューションキー、クラスタリングキー、または `Event_time_column` として設定されている列は削除できません。
-
外部テーブルから列を削除することはできません。
-
JSONB 関連の列を削除すると、関連付けられた JSONB インデックスも削除されます。
-
`proxima_vector` 列を削除する場合は、
cascadeパラメーターを指定する必要があります。 -
`Serial` 列を削除する際に、この列に基づいてシーケンスが作成されていた場合、そのシーケンスも削除されます。
-
テーブルに対してマテリアライズドビューが作成されている場合、ソーステーブルや、マテリアライズドビューによって参照されているソーステーブルの列を削除することはできません。
-
-
構文
重要Hologres 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 以降、列の名前を変更できます。構文は次のとおりです。
-
ご利用のインスタンスが V1.1 より前のバージョンの場合は、「アップグレード準備時の一般的なエラー」をご参照いただくか、Hologres DingTalk グループに参加してフィードバックをお寄せください。詳細については、「オンラインサポートの追加入手方法」をご参照ください。
-
パーティションテーブルを使用する場合、特定の-子テーブルではなく、親テーブルの列のみ名前を変更できます。親テーブルとその子テーブルのデータ構造は一致している必要があります。親テーブルの列の名前を変更すると、その変更はすべての子テーブルに自動的に適用されます。
-
複数のテーブルの列を同時に名前変更することはできません。
-
テーブルのオーナーのみが列の名前を変更できます。データベースで簡易権限モデルを使用している場合は、開発者ユーザーグループの権限が必要です。
-
構文
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;
デフォルト値の変更
`ALTER TABLE` 文を使用して、列のデフォルト値を変更できます。デフォルト値は定数または定数式に設定できます。新しいデフォルト値は、変更後に書き込みまたは更新されるデータにのみ適用されます。テーブル内の既存のデータには影響しません。この機能は Hologres V0.9.23 以降でのみ利用可能です。次のセクションでは、デフォルト値を変更する方法について説明します。
-
構文
-- テーブルフィールドのデフォルト値を変更 ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER COLUMN <column> SET DEFAULT <expression>; -- テーブルフィールドのデフォルト値を削除 ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER COLUMN <column> DROP DEFAULT; -
例
-- holo_test テーブルの id 列のデフォルト値を 0 に設定 ALTER TABLE IF EXISTS holo_test ALTER COLUMN id SET DEFAULT 0; -- holo_test テーブルの id 列のデフォルト値を削除 ALTER TABLE IF EXISTS holo_test ALTER COLUMN id DROP DEFAULT;
テーブルプロパティの変更
Hologres では、文を実行してパラメーターを修正し、テーブルプロパティを変更できます。次のセクションでは、テーブルプロパティを変更する方法について説明します。
-
dictionary_encoding_columns プロパティの変更。ディクショナリエンコーディングの設定を変更すると、データファイルが再エンコードされます。このプロセスは、一定期間 CPU とメモリリソースを消費します。この変更はオフピーク時に実行することを推奨します。
-
構文
-- dictionary_encoding_columns の変更 (V2.1 から利用可能) ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (dictionary_encoding_columns = '[columnName{:[on|off|auto]}[,...]]'); --完全な変更のみがサポートされています。 -- dictionary_encoding_columns の変更 (すべてのバージョン) --完全な変更 CALL SET_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'dictionary_encoding_columns', '[columnName{:[on|off|auto]}[,...]]'); --増分変更。呼び出しで指定されたフィールドのみが変更されます。他のフィールドは変更されません。 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
現在のフィールドに対して dictionary_encoding_columns を有効にします。
off
現在のフィールドに対して dictionary_encoding_columns を無効にします。
auto
自動。このパラメーターを auto に設定すると、Hologres は列の値の繰り返し率に基づいて dictionary_encoding_columns を有効にするかどうかを自動的に判断します。繰り返し率が高いほど、ディクショナリエンコーディングの利点が大きくなります。Hologres V0.8 以前では、すべての text 列に対して dictionary_encoding_columns がデフォルトで有効になっていました。Hologres V0.9 以降では、Hologres はデータの特徴に基づいてディクショナリエンコーディングを作成するかどうかを自動的に判断します。
-
例
-
列 a のディクショナリを明示的に作成し、列 b のディクショナリを作成するかどうかを自動的に判断し、列 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 のディクショナリを明示的に無効にします。システムは、列 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 の変更 (V2.1 から利用可能) ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (bitmap_columns = '[columnName{:[on|off]}[,...]]'); -- bitmap_columns の変更 (すべてのバージョン) --完全な変更 CALL SET_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'bitmap_columns', '[columnName{:[on|off]}[,...]]'); --増分変更。呼び出しで指定されたフィールドのみが変更されます。他のフィールドは変更されません。 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
現在のフィールドに対して bitmap_columns を有効にします。
off
現在のフィールドに対して bitmap_columns を無効にします。
-
例
-
列 a のビットマップインデックスを有効にし、列 b、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','bitmap_columns','a:on'); -
列 b のビットマップインデックスを無効にします。システムは、列 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');
-
-
-
テーブルデータの TTL の変更
-
構文
call set_table_property('[<schema_name>.]<table_name>', 'time_to_live_in_seconds', '<non_negative_literal>'); -
パラメーターの説明
パラメーター
説明
time_to_live_in_seconds
TTL と略されます。テーブルデータの存続時間 (秒単位)。値は正の整数である必要があります。
説明TTL は、データが Hologres に書き込まれた時点から開始されます。指定された期間が経過すると、データは削除されます。削除は秒単位で正確ではありません。
-
例
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 ページの上部のメニューバーで、Metadata Management をクリックします。
-
Metadata Management ページの左側にある ログイン中のインスタンス リストで、変更するターゲットテーブルをダブルクリックします。
-
テーブルの詳細ページで、テーブルフィールドと一部のテーブルプロパティを視覚的に変更できます。

-
右上隅にある Submit をクリックして、変更を完了します。