指定された SELECT 文を実行して取得したテーブルと同じスキーマを持つテーブルを作成するには、CREATE TABLE LIKE 文を実行します。このトピックでは、CREATE TABLE LIKE 文の実行方法について説明します。
制限事項
Hologres V0.9 以前では、
CREATE TABLE LIKE文を実行してテーブルスキーマのみをコピーできます。プライマリキーやインデックスなどのテーブルプロパティはコピーできません。 Hologres コンソールのインスタンス詳細ページで、Hologres インスタンスのバージョンを確認できます。Hologres V0.10 以降では、
CREATE TABLE LIKE文を実行して、プライマリキーやインデックスなどのテーブルスキーマとテーブルプロパティの両方をコピーできます。テーブルを作成するときに別のテーブルからテーブルプロパティをコピーするには、次のコマンドを実行して、関連する Grand Unified Configuration(GUC)パラメータを true に設定する必要があります。次に、CREATE TABLE LIKE文でSELECT * FROM <table_name>文を使用する必要があります。SELECT <column_1>, <column_2> FROM <table_name>などの他の SELECT 文はサポートされていません。set hg_experimental_enable_create_table_like_properties=true;CREATE TABLE LIKE文では、ソーステーブルからデータを同期できません。SELECT 文で列を指定する場合は、各列に一意のエイリアスを指定する必要があります。異なる列に同じエイリアスを指定すると、CREATE TABLE LIKE 文はテーブルに同じ名前の複数の列を作成します。その結果、エラーメッセージが返されます。サンプル文:
CALL hg_create_table_like('new_table', 'select *, 1 as c, ''a'' as c from src_table'); ERROR: column "c" specified more than once CONTEXT: SQL statement "create table new_table ( "a" integer, "b" text, "c" integer, "c" text );" PL/pgSQL function hg_create_table_like(text,text) line 22 at EXECUTECREATE TABLE LIKE文を実行すると、列コメントとバイナリログプロパティをコピーできます。テーブルコメントまたは動的パーティション分割プロパティはコピーできません。 V3.0.33 以降では、テーブルコメントのコピーがサポートされています。
標準テーブルの作成
構文
Hologres で標準テーブルを作成するには、
CREATE TABLE LIKE文を次の構文で使用します。-- 別のテーブルのスキーマをコピーして標準テーブルを作成します(プロパティはコピーしません)。 CALL hg_create_table_like('new_table_name', 'select_query'); -- 別のテーブルのスキーマとプロパティの両方をコピーして標準テーブルを作成します。 set hg_experimental_enable_create_table_like_properties=true; -- テーブルプロパティのコピー操作を許可するかどうかを指定します。パラメータ設定は、現在のセッションにのみ適用されます。 CALL hg_create_table_like('new_table_name', 'select * from old_table_name');説明hg_create_table_like 関数を呼び出すと、Hologres は、select_query パラメータで指定された SQL 文を実行して取得されたテーブルと同じスキーマを持つテーブルを作成します。 new_table_name は、作成するテーブルの名前を指定します。テーブルにはデータは挿入されません。
パラメータ
new_table_name: 作成するテーブルの名前。このパラメータは、固定文字列に設定する必要があります。変数の文字列やテーブル名を生成するために使用される関数には設定できません。 CREATE TABLE LIKE 文を実行して外部テーブルを作成することはできません。
select_query: データをクエリするために使用される SQL 文。 select_query パラメータを
select * from tablenameに設定すると、CREATE TABLE LIKE文は、プライマリキーとインデックスを含むソーステーブルのすべてのプロパティを自動的にコピーします。 SQL 文に多数の単一引用符(')が含まれている場合は、単一引用符(')をエスケープするために、$$query_sql$$の形式でクエリ文を指定することをお勧めします。この方法を使用すると、操作を簡素化できます。サンプル文:CALL HG_CREATE_TABLE_LIKE ('table_name', $$query_sql$$ [, 'partition_clause'])old_table_name: コピーするテーブルの名前。
例
この例では、次の文を実行して、Hologres にソーステーブルを作成します。
BEGIN; CREATE TABLE public.src_table ( "a" int8 NOT NULL, "b" text NOT NULL, PRIMARY KEY (a) ); CALL SET_TABLE_PROPERTY('public.src_table', 'orientation', 'column'); CALL SET_TABLE_PROPERTY('public.src_table', 'bitmap_columns', 'b'); CALL SET_TABLE_PROPERTY('public.src_table', 'dictionary_encoding_columns', 'b:auto'); CALL SET_TABLE_PROPERTY('public.src_table', 'time_to_live_in_seconds', '3153600000'); CALL SET_TABLE_PROPERTY('public.src_table', 'distribution_key', 'a'); CALL SET_TABLE_PROPERTY('public.src_table', 'storage_format', 'segment'); COMMIT;次のいずれかの方法を使用して
CREATE TABLE LIKE文を実行し、ソーステーブルに基づいて Hologres にテーブルを作成できます。ソーステーブルのスキーマとプロパティの両方をコピーしてテーブルを作成するには、次の文を実行します。
-- ソーステーブルのスキーマとプロパティの両方をコピーしてテーブルを作成します。 set hg_experimental_enable_create_table_like_properties=true; CALL hg_create_table_like('new_table', 'select * from src_table');ソーステーブルのスキーマに列を追加してテーブルを作成するには、次の文を実行します。
-- ソーステーブルのスキーマに列 c を追加してテーブルを作成します。列 c は、列 b と同じプロパティを持ちます。 CALL hg_create_table_like('holo_table_1', $$select *, "b" as c from src_table$$);
パーティションテーブルの作成
構文
Hologres でパーティションテーブルを作成するには、
CREATE TABLE LIKE文を次の構文で使用します。-- 別のテーブルのスキーマをコピーしてパーティションテーブルを作成します(プロパティはコピーしません)。 CALL hg_create_table_like('new_table_name', 'select_query', 'partition_clause');パラメータ
new_table_name: 作成するテーブルの名前。このパラメータは、固定文字列に設定する必要があります。変数の文字列やテーブル名を生成するために使用される関数には設定できません。 CREATE TABLE LIKE 文を実行して外部テーブルを作成することはできません。
select_query: データをクエリするために使用される SQL 文。 select_query パラメータを
select * from tablenameに設定すると、CREATE TABLE LIKE文は、プライマリキーとインデックスを含むソーステーブルのすべてのプロパティを自動的にコピーします。 SQL 文に多数の単一引用符(')が含まれている場合は、単一引用符(')をエスケープするために、$$query_sql$$の形式でクエリ文を指定することをお勧めします。この方法を使用すると、操作を簡素化できます。サンプル文:CALL HG_CREATE_TABLE_LIKE ('table_name', $$query_sql$$ [, 'partition_clause'])partition_clause: テーブルをパーティション分割するために使用される句。この句は、パーティションキーを指定します。 Hologres は、子のパーティションテーブルを自動的に作成しません。そのため、子のパーティションテーブルを手動で作成する必要があります。
例
この例では、次の文を実行して、Hologres にソーステーブルを作成します。
BEGIN; CREATE TABLE public.src_table ( "a" int8 NOT NULL, "b" text NOT NULL, PRIMARY KEY (a) ); CALL SET_TABLE_PROPERTY('public.src_table', 'orientation', 'column'); CALL SET_TABLE_PROPERTY('public.src_table', 'bitmap_columns', 'b'); CALL SET_TABLE_PROPERTY('public.src_table', 'dictionary_encoding_columns', 'b:auto'); CALL SET_TABLE_PROPERTY('public.src_table', 'time_to_live_in_seconds', '3153600000'); CALL SET_TABLE_PROPERTY('public.src_table', 'distribution_key', 'a'); CALL SET_TABLE_PROPERTY('public.src_table', 'storage_format', 'segment'); COMMIT;CREATE TABLE LIKE文を実行して、ソーステーブルに基づいて Hologres にパーティションテーブルを作成し、CREATE TABLE 文を実行して子のパーティションテーブルを作成できます。パーティションテーブルを作成するには、次の文を実行します。
-- ソーステーブルのスキーマに列 ds を追加してパーティションテーブルを作成します。列 ds をパーティションキーとして構成します。 CALL hg_create_table_like('new_table', $$select *, "b" as ds from src_table$$, 'partition by list(ds)');パーティションテーブルの子のパーティションテーブルを作成するには、次の文を実行します。
create table new_table_child_20201213 partition of new_table for values in('20201213');-- 20201213 をパーティションキー値として指定します。 create table new_table_child_20201214 partition of new_table for values in('20201214');-- 20201214 をパーティションキー値として指定します。
HoloWeb コンソールでのテーブルのコピー
HoloWeb を使用すると、SQL 文を記述することなく、視覚化された方法でテーブルをコピーできます。手順:
[HoloWeb コンソール] にログオンします。詳細については、「HoloWeb に接続してクエリを実行する」をご参照ください。
[HoloWeb コンソール] の上部ナビゲーションバーで、[メタデータ管理] をクリックします。
[メタデータ管理] タブの左側のナビゲーションウィンドウで、[接続済みインスタンス] リストでコピーするテーブルを右クリックし、[テーブルスキーマの複製] を選択します。
[テーブルスキーマの複製] タブで、必要に応じてパラメータを構成します。
セクション
パラメータ
説明
コピー先ロケーション
テーブル名
コピー先テーブルの名前。カスタム名を構成できます。デフォルト値:ソーステーブル名_copy。
説明
コピー先テーブルの説明。このパラメータはオプションです。
スキーマ
コピー先テーブルが存在するスキーマの名前。デフォルト値:public。
詳細設定
ソーステーブルのプロパティを複製する
ソーステーブルのプロパティをコピー先テーブルにコピーするかどうかを指定します。
説明ソーステーブルのプロパティは、Hologres V0.10 以降でのみコピーできます。 Hologres インスタンスのバージョンが V0.10 より前の場合は、このパラメータを [いいえ] に設定するか、インスタンスをアップグレードします。
右上隅にある [送信] をクリックします。