Hologres V1.3.21 以降では、CREATE TABLE AS ステートメントを実行して、ソーステーブルの構造をコピーすることでテーブルを作成できます。ソーステーブルからデータを同期するように選択できます。このトピックでは、Hologres で CREATE TABLE AS ステートメントを実行する方法について説明します。
背景情報
CREATE TABLE AS ステートメントを実行して、ソーステーブル、または指定された SELECT クエリを実行して取得されたテーブルと同じ構造を持つ新しいテーブルを作成できます。ソーステーブルから新しいテーブルにデータを自動的に同期するように選択できます。ただし、このステートメントはテーブルプロパティをコピーしません。
次の表は、CREATE TABLE AS と CREATE TABLE LIKE の構文の違いを示しています。ビジネス要件に基づいて適切なステートメントを選択できます。CREATE TABLE LIKE ステートメントの詳細については、「CREATE TABLE LIKE」をご参照ください。
課金方法 | CREATE TABLE AS | CREATE TABLE LIKE(関数) |
テーブル構造(スキーマとデータ型)をコピーする | サポートされています。 | サポートされています。 |
テーブルプロパティ(NULL 値の許容、デフォルト値、インデックス、プライマリキー、またはコメント)をコピーする | サポートされていません。 | 限定的にサポートされています。 |
ソーステーブルデータをコピーする | サポートされています。 | サポートされていません。 |
ソーステーブルをコピーし、プライマリキーやインデックスなどの新しいテーブルプロパティを手動で構成できるようにする | 限定的にサポートされています。プライマリキーは手動で構成できません。 | 限定的にサポートされています。プライマリキーは手動で構成できません。 |
パーティションテーブルの構造をコピーして、非パーティションテーブルを作成する | サポートされています。 | サポートされています。 |
パーティションテーブルを作成する | サポートされていません。 |
|
制限事項
CREATE TABLE AS
ステートメントは、Hologres V1.3.21 以降でのみサポートされています。説明Hologres インスタンスのバージョンが V1.3.21 より前の場合、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加してインスタンスのアップグレードを申請してください。Hologres インスタンスを手動でアップグレードする方法の詳細については、「インスタンスのアップグレード」をご参照ください。Hologres DingTalk グループへの参加方法の詳細については、「Hologres のオンラインサポートを受ける」をご参照ください。
CREATE TABLE AS
ステートメントを実行して、テーブル構造のみをコピーできます。プライマリキーやインデックスなどのテーブルプロパティはコピーできません。テーブルを作成する場合、
CREATE TABLE AS
ステートメントを使用すると、ソーステーブルから作成するテーブルにデータを自動的に同期できますが、データインポートの原子性は保証されません。ソーステーブルに、VARCHAR、BPCHAR、NUMERIC(DECIMAL)、BIT、VARBIT など、精度が定義されていないデータ型の列が含まれている場合、このステートメントを使用するときに、
CREATE TABLE AS
ステートメントでこれらの列の精度を明示的に指定する必要があります。指定しないと、エラーメッセージが返されます。ソーステーブルに INTERVAL、TIME、TIMETZ、TIMESTAMP、または TIMESTAMPTZ 型の列が含まれている場合、このステートメントを使用するときに、
CREATE TABLE AS
ステートメントでこれらの列の精度を指定することはできません。指定すると、エラーメッセージが返されます。CREATE TABLE AS
ステートメントを実行して、親テーブルまたは子テーブルから非パーティションテーブルを作成できます。テーブル構造のコピーとデータの同期のみが可能です。親テーブルをコピーする場合、このステートメントはすべての子テーブルのデータを自動的に同期します。パーティションキー制約や継承関係などのパーティション構造をコピーして、パーティションテーブルを作成することはできません。Hologres V3.0.9 以降では、サーバーレスコンピューティングリソースを使用して CREATE TABLE AS ステートメントを実行できます。サーバーレスコンピューティングリソースの詳細については、「サーバーレスコンピューティングのユーザーガイド」をご参照ください。
Hologres V3.0.9 より前のバージョンでは、CREATE TABLE AS ステートメントはメタデータウェアハウス(hologres.hg_query_log)に 1 つのレコードのみを生成します。このレコードは、CREATE TABLE AS ステートメント自体を表します。Hologres V3.0.9 以降では、CREATE TABLE AS ステートメントは 2 つのレコードを生成します。1 つのレコードは CREATE TABLE AS ステートメントを表し、もう 1 つのレコードは CREATE TABLE AS ステートメントの実行中に生成される INSERT ステートメントを表します。2 つのレコードはトランザクション ID によって関連付けられます。例:
SELECT query_id, query, extended_info FROM hologres.hg_query_log WHERE extended_info ->> 'source_trx' = '<transaction_id>' -- トランザクション ID は、CREATE TABLE AS ステートメントによって記録された trans_id フィールドから取得できます。 ORDER BY query_start ;
構文
CREATE TABLE AS
ステートメントは、次の構文を使用して Hologres にテーブルを作成します。
-- ソーステーブルをコピーしてテーブルを作成します。
CREATE TABLE [ IF NOT EXISTS ] <new_table_name> AS TABLE <src_table_name> [ WITH [ NO ] DATA ]
-- SELECT クエリの実行結果をコピーしてテーブルを作成します。
CREATE TABLE [ IF NOT EXISTS ] <new_table_name> AS <select_query> [ WITH [ NO ] DATA ]
パラメーター
パラメーター | 説明 |
new_table_name | 作成するテーブルの名前。このパラメーターは固定文字列に設定する必要があります。変数の文字列や、テーブル名を生成するために使用される関数には設定できません。CREATE TABLE AS ステートメントを実行して外部テーブルを作成することはできません。 |
[ IF NOT EXISTS ] | 同じ名前のテーブルが既に存在するかどうかを確認します。同じ名前のテーブルが既に存在する場合、テーブル作成ステップはスキップされます。 |
src_table_name | コピーするソーステーブルまたはビューの名前。 説明 Hologres V2.1.21 以降では、ビューをデータソースとして使用できます。ビューのスキーマとデータをコピーしてテーブルを作成できます。 |
select_query | データのクエリに使用される SQL ステートメント。詳細については、「SELECT」をご参照ください。 |
[ WITH [ NO ] DATA ] | ソーステーブルから作成するテーブルにデータを自動的に同期するかどうかを指定します。有効な値:
このパラメーターを指定しない場合、デフォルト値 |
例
ソースの非パーティションテーブルから非パーティションテーブルを作成します。
この例では、次のステートメントを実行して、ソーステーブルを作成し、テーブルにデータを挿入します。
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; INSERT INTO public.src_table VALUES (1,'qaz'),(2,'wsx');
シナリオ 1:ソーステーブルからデータを自動的に同期して、ソーステーブルからテーブルを作成します。
CREATE TABLE public.new_table AS TABLE public.src_table;
新しいテーブルからデータをクエリします。
SELECT * FROM public.new_table; ------- a | b --|----- 1 | qaz 2 | wsx
新しいテーブルのデータ定義言語(DDL)ステートメントをクエリします。DDL ステートメントは、新しいテーブルがソーステーブルのプライマリキーと NOT NULL プロパティを継承していないことを示しています。
-- 新しいテーブルの DDL ステートメント: select hg_dump_script('public.new_table'); ------------------------------------------- BEGIN; CREATE TABLE public.new_table ( a int, b text ); CALL set_table_property('public.new_table', 'orientation', 'column'); CALL set_table_property('public.new_table', 'storage_format', 'orc'); CALL set_table_property('public.new_table', 'bitmap_columns', 'b'); CALL set_table_property('public.new_table', 'dictionary_encoding_columns', 'b:auto'); CALL set_table_property('public.new_table', 'time_to_live_in_seconds', '3153600000'); COMMENT ON TABLE public.new_table IS NULL; END;
シナリオ 2:ソーステーブルからデータを自動的に同期して、ソーステーブルからテーブルを作成します。同じ名前のテーブルが既に存在する場合、テーブル作成ステップはスキップされ、ソーステーブルのデータは同期されません。
CREATE TABLE IF NOT EXISTS public.new_table AS TABLE public.src_table; NOTICE: relation "new_table" already exists, skipping
シナリオ 3:ソーステーブルの構造のみをコピーしてテーブルを作成します。ソーステーブルのデータは新しいテーブルに同期されません。
CREATE TABLE public.new_table AS TABLE public.src_table WITH NO DATA;
シナリオ 4:
SELECT
クエリの実行結果をコピーしてテーブルを作成し、データを自動的に同期します。CREATE TABLE public.new_table_2 AS SELECT * FROM public.src_table WHERE a = 1 ;
パーティションテーブルまたはパーティションテーブルのパーティションから非パーティションテーブルを作成します。パーティションテーブルから作成できるのは、非パーティションテーブルのみです。
この例では、次のステートメントを実行して、パーティションテーブルとパーティションテーブルの複数のパーティションを作成し、パーティションにデータを挿入します。
BEGIN; CREATE TABLE public.src_table_partitioned ( "a" int NOT NULL, "b" text , PRIMARY KEY (a) ) PARTITION BY LIST(a); CREATE TABLE public.src_table_child1 PARTITION OF public.src_table_partitioned FOR VALUES IN (1); CREATE TABLE public.src_table_child2 PARTITION OF public.src_table_partitioned FOR VALUES IN (2); CREATE TABLE public.src_table_child3 PARTITION OF public.src_table_partitioned FOR VALUES IN (3); COMMIT; INSERT INTO src_table_child1 VALUES (1,'aaa'); INSERT INTO src_table_child2 VALUES (2,'bbb'); INSERT INTO src_table_child3 VALUES (3,'ccc');
シナリオ 1:すべてのパーティションのデータを同期して、パーティションテーブルから非パーティションテーブルを作成します。
CREATE TABLE public.new_table_2 AS TABLE public.src_table_partitioned;
新しいテーブルからデータをクエリします。結果は、新しいテーブルにソーステーブルのすべてのパーティションのデータが含まれており、新しいテーブルが非パーティションテーブルであることを示しています。
SELECT * FROM public.new_table_2; ---------------------------------- a | b --|----- 2 | bbb 1 | aaa 3 | ccc
シナリオ 2:パーティションのデータを同期して、パーティションから非パーティションテーブルを作成します。
-- パーティションのデータを自動的に同期して、パーティションテーブルのパーティションからテーブルを作成します。このステートメントは、指定されたパーティションのデータのみを同期します。 CREATE TABLE public.new_table_3 AS TABLE public.src_table_child1;
SELECT クエリの実行結果をコピーしてテーブルを作成し、新しいテーブルのプロパティを構成します。
-- ソーステーブルを作成します。 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'); COMMIT; -- SELECT クエリの実行結果をコピーして、データを自動的に同期し、新しいテーブルのプロパティを構成して、テーブルを作成します。 BEGIN; CREATE TABLE public.new_table AS select * from public.src_table; CALL SET_TABLE_PROPERTY('public.new_table', 'bitmap_columns', 'b'); CALL SET_TABLE_PROPERTY('public.new_table', 'dictionary_encoding_columns', 'b:auto'); CALL SET_TABLE_PROPERTY('public.new_table', 'time_to_live_in_seconds', '3153600'); CALL SET_TABLE_PROPERTY('public.new_table', 'distribution_key', 'a'); COMMIT;