CREATE TABLE LIKE 文を実行すると、指定した SELECT 文の実行結果と同じスキーマのテーブルを作成できます。 このトピックでは、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文を実行すると、列コメントとバイナリログのプロパティをコピーできます。 テーブルコメントや動的パーティショニングプロパティはコピーできません。 ただし、Hologres 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 を追加してテーブルを作成します。 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 ページの上部メニューバーで、メタデータ管理 をクリックします。
-
[Metadata Management] ページの メタデータ管理 リストから、複製するテーブルを右クリックし、テーブルスキーマのコピー を選択します。
-
テーブルスキーマのコピー タブで、次のパラメーターを設定します。
セクション
パラメーター
説明
Destination
Table Name
コピー先テーブルの名前。 カスタム名を指定できます。 デフォルト値:ソーステーブル名_copy。
Description
コピー先テーブルの説明。 このパラメーターはオプションです。
Schema
コピー先テーブルが属するスキーマの名前。 デフォルト値:public。
Advanced Settings
Replicate Properties of Source Table
ソーステーブルのプロパティをコピー先テーブルにコピーするかどうかを指定します。
説明ソーステーブルプロパティの複製は、Hologres V0.10 以降のインスタンスでのみサポートされています。 それ以前のバージョンの場合は、いいえ を選択するか、インスタンスをアップグレードしてください。
-
右上隅にある コミット をクリックして、テーブルを複製します。