CREATE HYBRID TABLE

現在または指定のスキーマに新しいハイブリッドテーブルを作成するか、既存のテーブルを置き換えます。テーブルには複数の列を含めることができ、各列の定義は名前、データ型に加え、オプションで列に次があるかどうかにより構成されます。

  • NOT NULL 値を必要とする。

  • デフォルト値を持つか、アイデンティティ列である。

  • インライン制約がある。

注釈

ハイブリッド・テーブルを作成する際には、1つ以上のカラムに主キー制約を定義する必要があります。

また、ハイブリッド・テーブルを作成するために以下の CREATE TABLE 変数を使用することもできます。

標準的なSnowflakeテーブルに使用される完全な CREATE TABLE 構文については、 CREATE TABLE をご参照ください。

こちらもご参照ください。

CREATE INDEX DROP INDEX, SHOW INDEXES, ALTER TABLE, DROP TABLE, SHOW TABLES

構文

CREATE [ OR REPLACE ] HYBRID TABLE [ IF NOT EXISTS ] <table_name>
  ( <col_name> <col_type>
    [
      {
        DEFAULT <expr>
        | { AUTOINCREMENT | IDENTITY }
          [
            {
              ( <start_num> , <step_num> )
              | START <num> INCREMENT <num>
            }
          ]
          [ { ORDER | NOORDER } ]
      }
    ]
    [ NOT NULL ]
    [ inlineConstraint ]
    [ COMMENT '<string_literal>' ]
    [ , <col_name> <col_type> [ ... ] ]
    [ , outoflineConstraint ]
    [ , outoflineIndex ]
    [ , ... ]
  )
  [ COMMENT = '<string_literal>' ]
Copy

条件:

inlineConstraint ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY | { [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } }
  [ <constraint_properties> ]

outoflineConstraint ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE [ ( <col_name> [ , <col_name> , ... ] ) ]
    | PRIMARY KEY [ ( <col_name> [ , <col_name> , ... ] ) ]
    | [ FOREIGN KEY ] [ ( <col_name> [ , <col_name> , ... ] ) ]
      REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
  }
  [ <constraint_properties> ]
  [ COMMENT '<string_literal>' ]

outoflineIndex ::=
  INDEX <index_name> ( <col_name> [ , <col_name> , ... ] )
    [ INCLUDE ( <col_name> [ , <col_name> , ... ] ) ]
Copy

インライン制約とアウトオブライン制約の詳細については、 CREATE | ALTER TABLE ... CONSTRAINT をご参照ください。

必須パラメーター

name

テーブルの識別子(つまり、名前)を指定します。テーブルが作成されるスキーマに対して一意である必要があります。

また、識別子はアルファベット文字で始まる必要があり、識別子文字列全体が二重引用符で囲まれていない限り、スペースや特殊文字を含めることはできません(例: "My object")。二重引用符で囲まれた識別子も大文字と小文字が区別されます。

詳細については、 識別子の要件 をご参照ください。

col_name

列識別子(名前)を指定します。テーブル識別子のすべての要件は、列識別子にも適用されます。

詳細については、 識別子の要件 および 予約および制限されたキーワード をご参照ください。

注釈

標準の予約キーワードに加えて、次のキーワードは ANSI標準コンテキスト関数用に予約されているため、列識別子として使用できません。

  • CURRENT_DATE

  • CURRENT_ROLE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • CURRENT_USER

予約済みキーワードのリストについては、 予約および制限されたキーワード をご参照ください。

col_type

列のデータ型を指定します。

テーブル列に指定できるデータ型の詳細については、 SQL データ型リファレンス をご参照ください。

PRIMARY KEY ( col_name [ , col_name , ... ] )

テーブルに必要な主キー制約を、列定義内(インライン)または別個(アウトオブライン)に指定します。 ハイブリッドテーブルの制約 もご参照ください。

完全な構文の詳細については、 CREATE | ALTER TABLE ... CONSTRAINT をご参照ください。制約に関する一般的な情報については、 制約 をご参照ください。

オプションのパラメーター

DEFAULT ... または . AUTOINCREMENT ...

INSERT または CREATE HYBRID TABLE AS SELECT ステートメントで値が明示的に指定されていない場合に、デフォルト値を列に自動的に挿入するかどうかを指定します。

DEFAULT expr

列のデフォルト値は、次のいずれかの指定可能な式によって定義されます。

  • 定数値。

  • 単純式。

  • シーケンス参照(seq_name.NEXTVAL)。

単純式とは、スカラー値を返す式です。ただし、式に次の参照を含めることは できません

  • サブクエリ。

  • 集計。

  • ウィンドウ関数。

  • 外部関数。

{ AUTOINCREMENT | IDENTITY } . [ { ( start_num , step_num ) | START num INCREMENT num } ] . [ { ORDER | NOORDER } ]

AUTOINCREMENT が使用されている場合、列のデフォルト値は指定された数値で始まり、それに続く各値は自動的に生成されます。 AUTOINCREMENT 列が生成する値は一意であることが保証されます。生成された値の任意のペア間における差は、インクリメント量の倍数であることが保証されます。

オプションの ORDERNOORDER パラメーターは、生成された値が シーケンスのセマンティクス で指定された順序の保証を提供するかどうかを指定します。 NOORDER は、ハイブリッドテーブルの AUTOINCREMENT 列のデフォルトオプションです。 NOORDER は通常、ポイント記述のパフォーマンスを大幅に向上させます。

これらのパラメーターは、数値データ型の列(NUMBER 、 INT 、 FLOAT)にのみ使用できます。

AUTOINCREMENTIDENTITY は同義語です。列にいずれかが指定されている場合、Snowflakeはシーケンスを使用して列の値を生成します。シーケンスの詳細については、 シーケンスの使用 をご参照ください。

開始とステップ/増分の両方のデフォルト値は 1 です。

デフォルト:値なし(列にデフォルト値なし)

注釈

  • DEFAULTAUTOINCREMENT は、相互に排他的です。列には1つしか指定できません。

  • パフォーマンスを重視するワークロードでは、 NOORDERAUTOINCREMENT 列の推奨オプションです。

CONSTRAINT ...

テーブル内の指定された列のインラインまたはアウトライン制約を定義します。一意制約と外部キー制約は、ハイブリッド・テーブルの列ではオプションです。 ハイブリッドテーブルの制約 もご参照ください。

完全な構文の詳細については、 CREATE | ALTER TABLE ... CONSTRAINT をご参照ください。制約に関する一般的な情報については、 制約 をご参照ください。

INDEX index_name ( col_name [ , col_name , ... ]

テーブルの1つ以上の列に対するセカンダリ・インデックスを指定します。(ハイブリッド・テーブルの列に制約を定義すると、それらの列にインデックスが自動的に作成されます)。

半構造化列 (VARIANT, OBJECT, ARRAY)には、各記録のキーのための基礎となるストレージ・エンジンに関連するスペースの制約があるため、インデックスを定義できません。

地理空間列 (GEOGRAPHY, GEOMETRY)または ベクトル・データ型 (VECTOR)にはインデックスを定義できません。

インデックスはテーブル作成時に定義することも、 CREATE INDEX コマンドで定義することもできます。ハイブリッド・テーブルのインデックスの作成については、 CREATE INDEX をご参照ください。

INCLUDE ( col_name [ , col_name , ... ] )

セカンダリ・インデックスに含まれる1つ以上の列を指定します。セカンダリインデックスに含まれるカラムを使用することは、クエリが投影リストに列のセットを頻繁に含むが、述語リストには含まない場合に特に有用です。 INCLUDE 列でセカンダリインデックスを作成する をご参照ください。

INCLUDE カラムは半構造化カラム(VARIANT, OBJECT, ARRAY) や地理空間カラム(GEOGRAPHY, GEOMETRY)にはできません。

INCLUDE 列は、テーブルがセカンダリインデックスと作成される時にのみ指定できます。

COMMENT = 'string_literal'

列、制約、またはテーブル・レベルでのコメントを指定します。詳細については、 制約に対するコメント をご参照ください。

デフォルト: 値なし

使用上の注意

  • ハイブリッドテーブルを再作成または置換するには、 CREATE OR REPLACE HYBRID TABLE コマンドを実行する前に、 GET_DDL 関数を呼び出してハイブリッドテーブルの定義を確認します。

  • 仮または一時的な ハイブリッド・テーブルは作成できません。また、一時スキーマやデータベース内にハイブリッド・テーブルを作成することはできません。

  • スキーマに同じ名前のテーブルやビューを含めることはできません。テーブルを作成する場合:

    • 同じ名前のビューがスキーマにすでに存在する場合は、エラーが返され、テーブルは作成されません。

    • 同じ名前のテーブルがスキーマに既に存在する場合、オプションの OR REPLACE キーワードがコマンドに含まれていない限り、エラーが返され、テーブルは作成されません。

    重要

    OR REPLACE の使用は、既存のテーブルで DROP TABLE を使用してから、同じ名前で新しいテーブルを作成することと同じです。

    ドロップアクションと作成アクションは単一のアトミック操作で発生することに注意してください。これは、CREATE OR REPLACE TABLE 操作と同時に実行されるクエリが、古いテーブルバージョンまたは新しいテーブルバージョンのいずれかを使用することを意味します。

    テーブルを再作成または交換すると、変更データがドロップされます。

  • 予約キーワード と同様に、 ANSI 予約関数名(CURRENT_DATECURRENT_TIMESTAMP など)は列名として使用できません。

  • メタデータについて:

    注意

    Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。

ハイブリッドテーブルの制約

  • ハイブリッド・テーブルは主キー制約付きで作成する必要があります。

    複数列(または複合)主キーをサポートしています。複数列の主キーを定義するには、以下の例に示す構文を使用します。この場合、制約は「out of line」で定義され、テーブルに以前に定義された複数の列を参照します。

    CREATE OR REPLACE HYBRID TABLE ht2pk (
      col1 INTEGER NOT NULL,
      col2 INTEGER NOT NULL,
      col3 VARCHAR,
      CONSTRAINT pkey_1 PRIMARY KEY (col1, col2)
      );
    
    Copy
  • 一意の主キーと外部キー制約は、ハイブリッドテーブルに適用されます。これらの制約の制限については、 ハイブリッドテーブルでサポートされていない機能と制限事項 をご参照ください。

  • 一意制約と外部キー制約は、それぞれ独自の基になるインデックスを構築します。インデックスによって追加データが格納されます。セカンダリ(またはカバリング)インデックスは、 outoflineIndex 構文を使用して、テーブル作成時に明示的に定義することもできます。

CREATE HYBRID TABLE ... AS SELECT (CTAS)

別のハイブリッドテーブルに対するクエリの結果を含む新しいハイブリッドテーブルを作成します。

CREATE [ OR REPLACE ] HYBRID TABLE <table_name> [ ( <col_name> [ <col_type> ] , <col_name> [ <col_type> ] , ... ) ]
  AS <query>
  [ ... ]
Copy

注釈

CTAS を使用してハイブリッドテーブルを作成する場合は、主キー、インデックス、および制約を含むテーブルスキーマを明示的に定義します。SELECT ステートメントから推測したスキーマに依存しないでください。

指定する列名の数は、クエリ内の SELECT リスト項目の数と一致している必要があります。

特定の順序で行を持つテーブルを作成するには、クエリの最後に ORDER BY 句を使用します。

ハイブリッド・テーブルのロードについては、 データのロード をご参照ください。

CREATE HYBRID TABLE ... LIKE

既存のハイブリッドテーブルと同じ列定義を使用して新しいハイブリッドテーブルを作成しますが、既存のテーブルからはデータをコピーしません。

列名、タイプ、デフォルト、および制約が新しいテーブルにコピーされます。

CREATE [ OR REPLACE ] HYBRID TABLE <table_name> LIKE <source_hybrid_table>
  [ ... ]
Copy

注釈

現在、 CREATE HYBRID TABLE ... LIKE は、ソーステーブル型として別のハイブリッドテーブルのみをサポートしています。

データ共有を介してアクセスされる自動インクリメントシーケンスを持つテーブルに対する CREATE HYBRID TABLE ... LIKE は、現在サポートされていません。

主キーとしての customer_id を持つ現在のデータベースで email に一意制約、 full_name にセカンダリインデックスを持つハイブリッドテーブルを作成します。

CREATE HYBRID TABLE mytable (
  customer_id INT AUTOINCREMENT PRIMARY KEY,
  full_name VARCHAR(255),
  email VARCHAR(255) UNIQUE,
  extended_customer_info VARIANT,
  INDEX index_full_name (full_name)
);
Copy
+-------------------------------------+
| status                              |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+

このテーブルに行を挿入します。

INSERT INTO mytable (customer_id, full_name, email, extended_customer_info)
  SELECT 100, 'Jane Doe', 'jdoe@gmail.com',
    parse_json('{"address": "1234 Main St", "city": "San Francisco", "state": "CA", "zip":"94110"}');
Copy
+-------------------------+
| number of rows inserted |
|-------------------------|
|                       1 |
+-------------------------+

主キーは一意にする必要があります。たとえば、前の例と同じ主キーを2回目に挿入しようとすると、このコマンドは次のエラーを発生して失敗します。

200001 (22000): Primary key already exists

メールアドレスもインライン UNIQUE 制約に従う必要があります。たとえば、同じメールアドレスを持つ2つの記録を挿入しようとすると、ステートメントは次のエラーで失敗します。

Duplicate key value violates unique constraint "SYS_INDEX_MYTABLE_UNIQUE_EMAIL"

テーブルのプロパティとメタデータを表示します。 is_hybrid 列の値に注意してください。

SHOW TABLES LIKE 'mytable';
Copy
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
| created_on                    | name    | database_name | schema_name | kind  | is_hybrid | comment | cluster_by | rows | bytes | owner  | retention_time | automatic_clustering | change_tracking | search_optimization | search_optimization_progress | search_optimization_bytes | is_external |
|-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------|
| 2022-02-23 23:53:19.707 +0000 | MYTABLE | MYDB          | PUBLIC      | TABLE | Y         |         |            | NULL |  NULL | MYROLE | 10             | OFF                  | OFF             | OFF                 |                         NULL |                      NULL | N           |
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+

すべてのハイブリッドテーブルの詳細を表示します。

SHOW HYBRID TABLES;
Copy
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
| created_on                    | name                      | database_name | schema_name | owner        | datastore_id | rows | bytes | comment |
|-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------|
| 2022-02-24 02:07:31.877 +0000 | MYTABLE                   | DEMO_DB       | PUBLIC      | ACCOUNTADMIN |         2002 | NULL |  NULL |         |
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+

テーブルの列に関する情報を表示します。

DESCRIBE TABLE mytable;
Copy
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name              | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| CUSTOMER_ID       | NUMBER(38,0) | COLUMN | N     | NULL    | Y           | N          | NULL  | NULL       | NULL    | NULL        |
| FULL_NAME         | VARCHAR(256) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| APPLICATION_STATE | VARIANT      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

テーブルからデータを選択します。

SELECT customer_id, full_name, email, extended_customer_info
  FROM mytable
  WHERE extended_customer_info['state'] = 'CA';
Copy
+-------------+-----------+----------------+------------------------------+
| CUSTOMER_ID | FULL_NAME | EMAIL          | EXTENDED_CUSTOMER_INFO       |
|-------------+-----------+----------------+------------------------------|
|         100 | Jane Doe  | jdoe@gmail.com | {                            |
|             |           |                |   "address": "1234 Main St", |
|             |           |                |   "city": "San Francisco",   |
|             |           |                |   "state": "CA",             |
|             |           |                |   "zip": "94110"             |
|             |           |                | }                            |
+-------------+-----------+----------------+------------------------------+

INCLUDE 列でセカンダリインデックスを作成する

例えば、 employee テーブルをカバーインデックス付きで作成します。

CREATE HYBRID TABLE employee (
    employee_id INT PRIMARY KEY,
    employee_name STRING,
    employee_department STRING,
    INDEX idx_department (employee_department) INCLUDE (employee_name)
);
Copy

以下の行を挿入します。

INSERT INTO employee VALUES
  (1, 'John Doe', 'Marketing'),
  (2, 'Jane Smith', 'Sales'),
  (3, 'Bob Johnson', 'Finance'),
  (4, 'Alice Brown', 'Marketing');
Copy

以下のクエリはカバリング・インデックスを使用します。

SELECT employee_name FROM employee WHERE employee_department = 'Marketing';
SELECT employee_name FROM employee WHERE employee_department IN ('Marketing', 'Sales');
Copy

ベーステーブルへのルックアップを回避することにより、両方のクエリがカバリングインデックスの恩恵を受けます。しかし、インデックスに含まれる列を使用すると、追加の列がセカンダリインデックスに格納されるため、ストレージの消費量が増加する可能性があることに注意してください。

主キー列にコメントを付けたハイブリッドテーブルを作成する

主キーの列定義にコメントを含むハイブリッド・テーブルを作成します。

CREATE OR REPLACE HYBRID TABLE ht1pk
  (COL1 NUMBER(38,0) NOT NULL COMMENT 'Primary key',
  COL2 NUMBER(38,0) NOT NULL,
  COL3 VARCHAR(16777216),
  CONSTRAINT PKEY_1 PRIMARY KEY (COL1));

DESCRIBE TABLE ht1pk;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment     | policy name | privacy domain |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------|
| COL1 | NUMBER(38,0)      | COLUMN | N     | NULL    | Y           | N          | NULL  | NULL       | Primary key | NULL        | NULL           |
| COL2 | NUMBER(38,0)      | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL        | NULL        | NULL           |
| COL3 | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL        | NULL        | NULL           |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------+

このコメントを CONSTRAINT 句に記述した場合、 DESCRIBE TABLE 出力にはコメントが表示されないことにご注意ください。 TABLE_CONSTRAINTS ビュー をクエリして、制約に関する完全な情報を見ることができます。