`CREATE TABLE LIKE` 文は、`SELECT` クエリの結果と同一のスキーマを持つテーブルを作成します。このトピックでは、`CREATE TABLE LIKE` 文の使用方法について説明します。
制限事項
-
Hologres V0.9 以前のバージョンでは、
CREATE TABLE LIKE文はテーブルスキーマのみをコピーします。プライマリキーやインデックスなどのテーブルプロパティはコピーされません。インスタンスのバージョンは、Hologres コンソールのインスタンス製品ページで確認できます。 -
Hologres V0.10 以降のバージョンでは、
CREATE TABLE LIKE文を使用して、テーブルスキーマと、プライマリキーやインデックスなどのテーブルプロパティの両方をコピーできます。これを行うには、次のコマンドを実行して Grand Unified Configuration (GUC) パラメーターを設定する必要があります。このパラメーターを有効にすると、CREATE TABLE LIKEはSELECT * FROM <table_name>構文を使用した場合にのみテーブルのコピーをサポートします。`SELECT <column_1>, <column_2> FROM <table_name>` などの他の構文はサポートされていません。set hg_experimental_enable_create_table_like_properties=true; -
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 EXECUTE -
CREATE TABLE LIKE文は、カラムコメントとバイナリログ (Binlog) プロパティのコピーをサポートしています。テーブルコメントや動的パーティションプロパティのコピーはサポートしていません。テーブルコメントをコピーする機能は、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 関数を呼び出すと、select_query の結果のスキーマに基づいて new_table_name という名前のテーブルが作成されます。データは挿入されません。
-
Parameter Description
-
new_table_name:作成するテーブルの名前。外部テーブルは作成できません。このパラメーターは固定文字列のみをサポートします。文字列連結や関数で生成された文字列はサポートされていません。
-
select_query:文字列として指定されるクエリ SQL 文。SQL 文が厳密に
select * from tablenameである場合、CREATE TABLE LIKEはプライマリキーとインデックスを含むソーステーブルのすべてのプロパティを自動的にコピーします。SQL 文に複数のシングルクォーテーションが含まれている場合は、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;次の例は、Hologres で
CREATE TABLE LIKEを使用する方法を示しています。-
ソーステーブルと同じスキーマとプロパティを持つテーブルを作成します。
-- テーブルとそのプロパティをコピーします。 set hg_experimental_enable_create_table_like_properties=true; CALL hg_create_table_like('new_table', 'select * from src_table'); -
ソーステーブルに基づいてフィールドを追加してテーブルを作成します。
-- フィールド b と同じフィールド 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'); -
Parameter Description
-
new_table_name:作成するテーブルの名前。外部テーブルは作成できません。このパラメーターは固定文字列のみをサポートします。文字列連結や関数で生成された文字列はサポートされていません。
-
select_query:文字列として指定されるクエリ SQL 文。SQL 文が厳密に
select * from tablenameである場合、CREATE TABLE LIKEはプライマリキーとインデックスを含むソーステーブルのすべてのプロパティを自動的にコピーします。SQL 文に複数のシングルクォーテーションが含まれている場合は、SQL 文を $$ 記号で囲むことができます。これにより、文を$$query_sql$$として再書き込みし、シングルクォーテーションを自動的にエスケープできます。この方法は使いやすいため推奨されます。構文は次のとおりです。CALL HG_CREATE_TABLE_LIKE ('table_name', $$query_sql$$ [, 'partition_clause']) -
partition_clause:パーティションを定義する句。このパラメーターを使用してパーティションキーを指定できます。子パーティションテーブルは自動的に作成されません。手動で作成する必要があります。
-
-
例
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;次の例は、Hologres で
CREATE TABLE LIKEを使用してパーティションテーブルを作成する方法を示しています。-
パーティションテーブルを作成します。
-- 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 UI を使用したテーブルのコピー
HoloWeb は、SQL コマンドを記述せずにテーブルをコピーできるユーザーインターフェース (UI) を提供します。これを行うには、次の手順を実行します。
-
HoloWeb ページに移動します。詳細については、「HoloWeb への接続とクエリの実行」をご参照ください。
-
HoloWeb ページの上部のメニューバーで、Metadata Management をクリックします。
-
Metadata Management ページの左側にあるナビゲーションウィンドウの [ログイン中のインスタンス] リストで、複製するテーブルを右クリックし、Replicate Table Schema を選択します。
-
Replicate Table Schema タブで、次のパラメーターを設定します。

カテゴリ
パラメーター
説明
ターゲットの場所
テーブル名
ターゲットテーブルの名前。カスタム名を指定できます。デフォルト名は <source_table_name>_copy です。
説明
ターゲットテーブルの説明。このパラメーターはオプションです。
スキーマ
ターゲットテーブルが存在するスキーマ。デフォルト値は public です。
詳細オプション
ソーステーブルのプロパティを同期
ソーステーブルのプロパティをターゲットテーブルに同期するかどうかを指定します。
説明Hologres V0.10 以降のインスタンスのみがソーステーブルプロパティの同期をサポートします。ご利用のインスタンスが V0.10 より前のバージョンの場合は、No を選択するか、インスタンスをアップグレードしてください。
-
右上隅にある Submit をクリックしてテーブルをコピーします。