すべてのプロダクト
Search
ドキュメントセンター

Hologres:CREATE TABLE AS

最終更新日:Apr 04, 2025

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 値の許容、デフォルト値、インデックス、プライマリキー、またはコメント)をコピーする

サポートされていません。

限定的にサポートされています。

ソーステーブルデータをコピーする

サポートされています。

サポートされていません。

ソーステーブルをコピーし、プライマリキーやインデックスなどの新しいテーブルプロパティを手動で構成できるようにする

限定的にサポートされています。プライマリキーは手動で構成できません。

限定的にサポートされています。プライマリキーは手動で構成できません。

パーティションテーブルの構造をコピーして、非パーティションテーブルを作成する

サポートされています。

サポートされています。

パーティションテーブルを作成する

サポートされていません。

partition_clause を使用して、パーティションテーブルを手動で作成できます。

制限事項

  • 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 ]

ソーステーブルから作成するテーブルにデータを自動的に同期するかどうかを指定します。有効な値:

  • WITH DATA: データを自動的に同期します。

  • WITH NO DATA: データを自動的に同期しません。

このパラメーターを指定しない場合、デフォルト値 WITH 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;