CREATE TABLE

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

  • 値(NOT NULL)が必要かどうか。

  • デフォルト値があるかどうか。

  • 参照整合性の制約(主キー、外部キーなど)があるかどうか。

さらに、このコマンドは次のバリアントをサポートしています。

  • CREATE OR ALTER TABLE (テーブルが存在しない場合はテーブルを作成するか、テーブル定義に従ってテーブルを変更します)

  • CREATE TABLE ... AS SELECT (データが入ったテーブルを作成します。CTAS とも呼ばれます)

  • CREATE TABLE ... USING TEMPLATE (ステージングされたファイルのセットから派生した列定義を持つテーブルを作成します)

  • CREATE TABLE ... LIKE (既存テーブルの空のコピーを作成します)

  • CREATE TABLE ... CLONE (既存のテーブルのクローンを作成します)

  • CREATE TABLE ... FROM ARCHIVE OF (アーカイブデータからテーブルを作成します)

  • :ref:`CREATE TABLE ... FROM BACKUP SET <label-create_table_from_snapshot_set_syntax>`(新しい名前のバックアップからテーブルを復元します)

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

ALTER TABLEDROP TABLESHOW TABLESDESCRIBE TABLE

構文

CREATE [ OR REPLACE ]
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | VOLATILE | TRANSIENT } ]
  TABLE [ IF NOT EXISTS ] <table_name>

  (
    -- Column definition
    <col_name> <col_type>
      [ inlineConstraint ]
      [ NOT NULL ]
      [ COLLATE '<collation_specification>' ]
      [
        {
          DEFAULT <expr>
          | { AUTOINCREMENT | IDENTITY }
            [
              {
                ( <start_num> , <step_num> )
                | START <num> INCREMENT <num>
              }
            ]
            [ { ORDER | NOORDER } ]
        }
      ]
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ [ WITH ] PROJECTION POLICY <policy_name> ]
      [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

    -- Out-of-line constraints
    [ , outoflineConstraint [ ... ] ]
  )

  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COPY GRANTS ]
  [ COPY TAGS ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
  [ [ WITH ] JOIN POLICY <policy_name> [ ALLOWED JOIN KEYS ( <col_name> [ , ... ] ) ] ]
  [ [ WITH ] STORAGE LIFECYCLE POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
Copy

条件:

col_nameオブジェクト識別子Snowflake識別子の要件 に従わなければなりません。

NUMBER または VARCHAR など、 col_type は、 Snowflakeデータタイプ の1つです。

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

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

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>' ]
Copy

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

注釈

CREATE STAGE、 ALTER STAGE、 CREATE TABLE、または ALTER TABLE コマンドを使用して、ファイルフォーマットオプションやコピーオプションを指定しないでください。コピーオプションの指定には、 COPY INTO <テーブル> コマンドを使用することをお勧めします。

復元されたテーブル(バックアップから)

CREATE TABLE <name> FROM BACKUP SET <backup_set> IDENTIFIER '<backup_id>'
Copy

バリアント構文

CREATE OR ALTER TABLE

テーブルが存在しない場合は作成するか、テーブル定義に従ってテーブルを変更します。CREATE OR ALTER TABLE 構文は CREATE TABLE ステートメントのルールに従い、この構文には ALTER TABLE ステートメントと同じ制限があります。テーブルが変換されても、テーブル内の既存のデータは可能な限り保持されます。列をドロップする必要がある場合は、データ損失が発生する可能性があります。

テーブルを変更する場合は、以下の変更がサポートされます。

  • テーブルのプロパティとパラメーターを変更します。例: ENABLE_SCHEMA_EVOLUTION、 DATA_RETENTION_TIME_IN_DAYS、または CLUSTER BY。

  • 列のデータ型、デフォルト値、NULL値の許容、コメント、または自動増分を変更します。

  • 列リストの最後に新しい列を追加します。

  • 列をドロップします。

  • インラインまたはアウトオブライン制約を追加、ドロップ、変更します。

  • クラスタリングキーを追加、ドロップ、変更します。

詳細については、 CREATE OR ALTER TABLE の使用上の注意 をご参照ください。

CREATE OR ALTER
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | TRANSIENT } ]
  TABLE <table_name> (
    -- Column definition
    <col_name> <col_type>
      [ inlineConstraint ]
      [ NOT NULL ]
      [ COLLATE '<collation_specification>' ]
      [
        {
          DEFAULT <expr>
          | { AUTOINCREMENT | IDENTITY }
            [
              {
                ( <start_num> , <step_num> )
                | START <num> INCREMENT <num>
              }
            ]
            [ { ORDER | NOORDER } ]
        }
      ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

    -- Out-of-line constraints
    [ , outoflineConstraint [ ... ] ]
  )
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COMMENT = '<string_literal>' ]
Copy

CREATE TABLE ... AS SELECT (CTAS とも呼ばれる)

クエリによって返されたデータが入力される新しいテーブルを作成します。

CREATE [ OR REPLACE ] TABLE <table_name> [ ( <col_name> [ <col_type> ] , <col_name> [ <col_type> ] , ... ) ]
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ COPY GRANTS ]
  [ COPY TAGS ]
  [ ... ]
  AS <query>
Copy

マスキングポリシーは、 CTAS ステートメントの列に適用できます。列のデータ型の後にマスキングポリシーを指定します。同様に、行アクセスポリシーをテーブルに適用できます。例:

CREATE TABLE <table_name> ( <col1> <data_type> [ WITH ] MASKING POLICY <policy_name> [ , ... ] )
  ...
  [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col1> [ , ... ] )
  [ ... ]
  AS <query>
Copy

注釈

CTAS ステートメントでは、 COPY GRANTS 句は、 OR REPLACE 句と組み合わせた場合にのみ有効です。COPY GRANTS は、 SELECT ステートメントでクエリされているソーステーブルからではなく、 CREATE OR REPLACE で置き換えられているテーブル(既に存在する場合)から権限をコピーします。CTAS と合わせて COPY GRANTS を使用すると、テーブルに対する既存の権限を維持しながら、新しいデータセットでテーブルを上書きできます。

COPY GRANTS の詳細については、このドキュメント内の COPY GRANTS をご参照ください。

CREATE TABLE ... USING TEMPLATE

INFER_SCHEMA 関数を使用してステージングされたファイルのセットから派生した列定義で、新しいテーブルを作成します。この機能は、Apache Parquet、Apache Avro、 ORC、 JSON、 CSV ファイルをサポートしています。

CREATE [ OR REPLACE ] TABLE <table_name>
  [ COPY GRANTS ]
  USING TEMPLATE <query>
  [ ... ]
Copy

注釈

ステートメントにより同じ名前の既存のテーブルを置き換える場合、権限は置き換えられるテーブルからコピーされます。その名前の既存のテーブルがない場合、権限はクローンされるソーステーブルからコピーされます。

COPY GRANTS の詳細については、このドキュメント内の COPY GRANTS をご参照ください。

CREATE TABLE ... LIKE

既存のテーブルと同じ列定義を使用して新しいテーブルを作成しますが、既存のテーブルからデータをコピーしません。列名、タイプ、デフォルト、および制約が新しいテーブルにコピーされます。

CREATE [ OR REPLACE ] TABLE <table_name> LIKE <source_table>
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ COPY GRANTS ]
  [ ... ]
Copy

COPY GRANTS の詳細については、このドキュメント内の COPY GRANTS をご参照ください。

注釈

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

CREATE TABLE ... CLONE

データを実際にコピーすることなく、同じ列定義を使用して、ソーステーブルのすべての既存データを含む新しいテーブルを作成します。このバリアントは、過去の特定の時間/ポイントでテーブルをクローンするためにも使用できます( Time Travel を使用)。

CREATE [ OR REPLACE ]
    [ {
          [ { LOCAL | GLOBAL } ] TEMP [ READ ONLY ] |
          TEMPORARY [ READ ONLY ] |
          VOLATILE |
          TRANSIENT
    } ]
  TABLE <name> CLONE <source_table>
    [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
    [ COPY GRANTS ]
    [ ... ]
Copy

注釈

  • ステートメントにより同じ名前の既存のテーブルを置き換える場合、権限は置き換えられるテーブルからコピーされます。その名前の既存のテーブルがない場合、権限はクローンされるソーステーブルからコピーされます。

  • テーブルを直接クローンした場合、そのテーブル上のストリームはクローンされません。

  • ストリームを持つテーブルを含むスキーマをクローンすると、ストリームもクローンされます。

COPY GRANTS の詳細については、このドキュメント内の COPY GRANTS をご参照ください。

クローンの詳細については、 CREATE <オブジェクト> ... CLONE をご参照ください。

動的テーブルをテーブルにクローンする方法の詳細については、動的テーブルを新しいテーブルにクローンする をご参照ください。

CREATE TABLE ... FROM ARCHIVE OF

ストレージライフサイクルポリシー よりアーカイブされた行を含む新しいテーブルを作成します。特定のアーカイブデータを取得するためのフィルター条件を指定できます。

CREATE [ TRANSIENT ] TABLE [ IF NOT EXISTS ] <name>
  FROM ARCHIVE OF <source_table> [ [ AS ] <alias_name> ]
  WHERE <expression>
Copy

詳細については、 FROM ARCHIVE OF パラメーター使用上の注意 をご参照ください。

必須パラメーター

name

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

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

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

col_name

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

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

注釈

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

  • CURRENT_DATE

  • CURRENT_ROLE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • CURRENT_USER

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

col_type

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

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

query

CTAS および USING TEMPLATE に必要です。

  • CTAS の場合は、テーブルを自動入力する SELECT ステートメント を指定します。このクエリは、他のパラメーターの有無にかかわらず、 CTAS ステートメントで最後に指定する必要があります。

  • CREATE TABLE ... USING TEMPLATE の場合は、 INFER_SCHEMA 関数を呼び出し、出力を配列としてフォーマットするサブクエリを指定します。または、 USING TEMPLATE は INFER_SCHEMA 出力を文字列リテラルまたは変数として受け入れます。

source_table

LIKE、CLONE、および FROM ARCHIVE OF に必要です。

  • CREATE TABLE ... LIKE の場合は、プロパティと列定義がコピーされるテーブルを指定します。

  • CREATE TABLE ... CLONE の場合は、クローンのソースとして使用するテーブルを指定します。

  • CREATE TABLE ... FROM ARCHIVE OF については、 FROM ARCHIVE OF パラメーター をご参照ください。

バックアップのパラメーター

FROM BACKUP SET 句は、バックアップからテーブルを復元します。他のテーブルプロパティは、バックアップテーブルにあるものとすべて同じであるため、指定しません。

注釈

FROM SNAPSHOT SET 句は非推奨です。代わりに FROM BACKUP SET を使用してください。

このフォームには CREATEORREPLACE 句がありません。通常は、新しい名前でテーブルを復元して、この新しいテーブルからデータまたはその他のオブジェクトを回復させるか、元のテーブルの名前を変更してから、元の名前でテーブルを復元します。

注釈

復元されたテーブルは、バックアップの元のテーブルから独立しています。復元されたテーブルと元のテーブルの間にクローニング関係はありません。したがって、復元されたテーブルのすべてのマイクロパーティションは、そのテーブルによって所有されます。

新しく復元されたテーブルのバックアップを作成する場合は、そのテーブル用に新しいバックアップセットを作成します。

バックアップの詳細については、 障害復旧向けのバックアップと不変ストレージ をご参照ください。

backup_set

特定のテーブル用に作成されたバックアップセットの名前を指定します。SHOW BACKUP SETS コマンドを使用して、適切なバックアップセットを見つけることができます。

backup_id

そのバックアップセット内にある特定のバックアップの識別子を指定します。SHOW BACKUPS IN BACKUP SET コマンドを使用して、バックアップの作成日時に基づいて、バックアップセット内で適切な識別子を見つけます。

FROM ARCHIVE OF パラメーター

source_table

ストレージライフサイクルポリシー によって行がアーカイブされたテーブルを指定します。このテーブルからアーカイブデータを取得します。

[ AS ] alias_name

ソーステーブル参照のオプションのエイリアス名を指定します。WHERE 句の列を参照する場合は、このエイリアスを使用します。

エイリアス名は オブジェクト識別子 のルールに従う必要があります。

WHERE expression

取得するアーカイブ行をフィルターする必須条件を指定します。式はソーステーブルの列を参照できます(指定されている場合はエイリアスを使用)。

WHERE 式の詳細については、 WHERE をご参照ください。

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

{ [ { LOCAL | GLOBAL } ] TEMP [ READ ONLY] | ` :newline:.` TEMPORARY [ READ ONLY] | . VOLATILE | ` :newline:.` TRANSIENT }

テーブルを作成した セッション の間だけ永続することを指定します。仮テーブルとそのすべてのコンテンツは、セッションの終了時にドロップされます。

TEMPORARY (例: GLOBAL TEMPORARY)の同義語と略語は、他のデータベースとの互換性のために提供されています(例えば、 CREATE TABLE ステートメントの移行時のエラーを防ぐため)。これらのキーワードのいずれかを使用して作成されたテーブルは、 TEMPORARY キーワードを使用して作成されたテーブルと同じように表示され、動作します。

デフォルト:値なし。テーブルが TEMPORARY または TRANSIENT として宣言されていない場合、そのテーブルは永続的です。

予期しない競合を回避するには、スキーマに既存のテーブルの名前を仮テーブルに付けないようにします。

スキーマ内にある別のテーブルと同じ名前の仮テーブルを作成した場合、そのテーブルで使用されるすべてのクエリや操作は、仮テーブルがドロップされるまで、セッション内の仮テーブルにのみ影響します。テーブルをドロップする場合は、スキーマに既存のテーブルではなく、仮テーブルをドロップします。

仮テーブルや一時テーブルについて、またそれらがストレージやコストに与える影響については、以下のリソースをご参照ください。

READ ONLY

テーブルが読み取り専用であることを指定します。READ ONLY は、 CREATE TABLE コマンドの CREATE TABLE ... CLONE バリアントで作成される仮テーブルに対してのみ有効です。

読み取り専用テーブルでは DML 操作は許可されず、 DDL 操作の以下のサブセットのみが許可されます。

  • ALTER TABLE ... { ALTER | MODIFY } COLUMN ... { SET | UNSET } COMMENT

  • ALTER TABLE ... { ALTER | MODIFY } COLUMN ... { SET | UNSET } MASKING POLICY

  • ALTER TABLE ... { ALTER | MODIFY } COLUMN ... { SET | UNSET } TAG

  • ALTER TABLE ... RENAME COLUMN ... TO

  • ALTER TABLE ... RENAME TO

  • ALTER TABLE ... { SET | UNSET } COMMENT

  • ALTER TABLE ... { SET | UNSET } TAG

  • COMMENT

  • DESCRIBE

  • DROP

  • SHOW

  • UNDROP

読み取り専用テーブルには、 METADATA$ROW_POSITION 列があります。このメタデータ列は、テーブルの各行に0から始まる連続した行番号を割り当てます。各行に割り当てられた行番号は、読み取り専用テーブルがドロップされるまで変更されません。

TRANSIENT

テーブルが一時的であることを指定します。

永続テーブルのように、一時テーブルは明示的にドロップされるまで存在し、適切な権限を持つすべてのユーザーに表示されます。ただし、一時テーブルは永続テーブルよりもデータ保護のレベルが低いため、システム障害が発生すると一時テーブルのデータが失われる可能性があります。そのため、一時テーブルは、Snowflakeの外部で再作成できるデータのみに使用する必要があります。

デフォルト:値なし。テーブルが TRANSIENT または TEMPORARY として宣言されていない場合、そのテーブルは永続的です。

注釈

一時テーブルには、ストレージに関する考慮事項がいくつかあります。

仮テーブルを作成するか一時テーブルを作成するかを決定する際のこれらおよびその他の考慮事項の詳細については、 仮テーブルと一時テーブルの使用 および Time TravelおよびFail-safeのストレージコスト をご参照ください。

CONSTRAINT ...

テーブル内の指定された列のインラインまたはアウトライン制約を定義します。

構文の詳細については、 CREATE | ALTER TABLE ... CONSTRAINT をご参照ください。制約の詳細については、 制約 をご参照ください。

COLLATE 'collation_specification'

文字列比較などの列操作に使用する照合順序を指定します。このパラメーターは、テキスト列: VARCHAR、STRING、TEXT などにのみ適用されます。詳細については、 照合順序仕様 をご参照ください。

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

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

DEFAULT expr

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

  • 定数値。

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

  • スカラー値を返す単純式。

    UDFが セキュアUDF でない場合、単純式にSQL UDF(ユーザー定義関数)を含めることができます。

    注釈

    デフォルトの式がSQLユーザー定義関数(UDF)を参照している場合、関数はテーブル作成時にその定義に置き換えられます。ユーザー定義関数が将来再定義される場合は、列のデフォルト式は更新されません。

    単純式 cannot には、次の参照を含めることができません。

    • サブクエリ。

    • 集計。

    • ウィンドウ関数。

    • セキュアUDFs

    • SQL以外の言語で書かれてるUDFs(例:Java、JavaScript)。

    • 外部関数。

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

AUTOINCREMENT または IDENTITY を指定すると、列のデフォルト値は指定された数値で始まり、連続する各値は指定された量だけ自動的に増加します。

AUTOINCREMENT と IDENTITY は同義であり、 NUMBER、 INT、 FLOAT など、数値データ型の列にのみ使用できます。

注意

Snowflakeはシーケンスを使用して、自動インクリメントされた列の値を生成します。シーケンスには制限があります。シーケンスのセマンティクス をご参照ください。

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

注釈

AUTOINCREMENT または IDENTITY 列に手動で値を挿入すると、値が重複することがあります。AUTOINCREMENT または IDENTITY 列に手動で値 5 を挿入した場合、その後に挿入された行では、同じ値 5 が列のデフォルト値として使用される可能性があります。

ORDER または NOORDER を使用して、自動インクリメント列のために生成される値を 昇順または降順 に生成するかどうかを指定します。

  • ORDER は、シーケンスまたは自動増分列に対して生成される値が、昇順(または、間隔が負の値の場合は降順)であることを指定します。

    たとえば、シーケンスまたは自動増分の列に START 1 INCREMENT 2 がある場合、生成される値は 13579 などです。

  • NOORDER は、値が昇順であることが保証されないことを指定します。

    たとえば、シーケンスに START 1 INCREMENT 2 がある場合、生成される値は 131015103 などです。

    NOORDER は、複数の INSERT 操作を同時に実行する必要がある場合(例: 複数のクライアントが複数の INSERT ステートメントを実行する場合)に、パフォーマンスを向上させることができます。

ORDER または NOORDER を指定しない場合は、 NOORDER_SEQUENCE_AS_DEFAULT パラメーターによってどのプロパティが設定されるかが決まります。

注釈

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

MASKING POLICY = policy_name

列に設定する マスキングポリシー を指定します。

このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。

PROJECTION POLICY policy_name

列に設定する 投影ポリシー を指定します。

このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。

COMMENT 'string_literal'

列のコメントを指定します。

(コメントは列レベルまたはテーブルレベルで指定できることに注意してください。それぞれの構文は少し異なります。)

USING ( col_name , cond_col_1 ... )

条件付きマスキングポリシー SQL 式に渡す引数を指定します。

リストの最初の列は、データをマスクまたはトークン化するポリシー条件の列を指定し、マスキングポリシーが設定されている列と一致する 必要 があります。

追加の列は、最初の列でクエリが実行されたときに、クエリ結果の各行のデータをマスクするかトークン化するかを決定するために評価する列を指定します。

USING 句が省略されている場合、Snowflakeは条件付きマスキングポリシーを通常の マスキングポリシー として扱います。

CLUSTER BY ( expr [ , expr , ... ] )

テーブル内の1つ以上の列または列式をクラスタリングキーとして指定します。詳細については、 クラスタリングキーとクラスタ化されたテーブル をご参照ください。

デフォルト:値なし(テーブルにクラスタリングキーが定義されていない)

重要

クラスタリングキーは、すべてのテーブルに対して意図または推奨されているわけでは ありません。通常、非常に大きな(つまり、マルチテラバイト)テーブルに役立ちます。

テーブルのクラスタリングキーを指定する前に、マイクロパーティションについて理解する必要があります。詳細については、 Snowflakeテーブル構造について をご参照ください。

ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE }

以下を含むソースファイルから、テーブルにロードされたデータからのテーブルスキーマを自動的に変更することを有効または無効にします。

  • 追加された列。

    デフォルトでは、スキーマ進化は、ロード操作ごとに最大100列の追加された列に制限されています。1回のロード操作で100列を超える列の追加をリクエストする場合は、 Snowflakeサポート にお問い合わせください。

  • NOT NULL 制約は、新しいデータファイルで欠落しているいくつの列からでもドロップすることができます。

TRUE に設定すると、自動テーブルスキーマ進化が有効になります。デフォルトの FALSE は、自動テーブルスキーマ進化を無効にします。

注釈

ファイルからのデータのロードでテーブル列が進化するのは、次のすべてが当てはまる場合です。

  • COPY INTO <テーブル> ステートメントには MATCH_BY_COLUMN_NAME オプションが含まれる。

  • データのロードに使用されるロールは、テーブルに対する EVOLVE SCHEMA または OWNERSHIP の権限を持っている。

さらに、 CSV でスキーマを進化させる際に、 MATCH_BY_COLUMN_NAMEPARSE_HEADER を使用する場合は、 ERROR_ON_COLUMN_COUNT_MISMATCH をfalseに設定する必要があります。

DATA_RETENTION_TIME_IN_DAYS = integer

テーブルの履歴データに対してTime Travelアクション(SELECT、CLONE、UNDROP)を実行できるように、テーブルの保持期間を指定します。詳細については、 Time Travelの理解と使用 および 仮テーブルと一時テーブルの使用 をご参照ください。

このオブジェクトレベルパラメーターの詳細な説明、およびオブジェクトパラメーターの詳細については、 パラメーター をご参照ください。

値:

  • Standard Edition: 0 または 1

  • Enterprise Edition:

    • 永続テーブルの場合は 090

    • 仮および一時テーブルの場合は 0 または 1

デフォルト:

  • Standard Edition: 1

  • Enterprise Edition(またはそれ以上): 1 (スキーマ、データベースまたはアカウントレベルで別のデフォルト値が指定されていない場合)

注釈

0 の値は、テーブルのTime Travelを効果的に無効化します。

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

Snowflakeがテーブルのデータ保持期間を延長してテーブル上のストリームが古くなるのを防ぐことができる最大日数を指定するオブジェクトパラメーター。

このパラメーターの詳細については、 MAX_DATA_EXTENSION_TIME_IN_DAYS をご参照ください。

CHANGE_TRACKING = { TRUE | FALSE }

テーブルで変更追跡を有効にするかどうかを指定します。

  • TRUE テーブルの変更追跡を有効にします。この設定により、非表示の列のペアがソーステーブルに追加され、変更追跡メタデータの列への保存が開始されます。これらの列は少量のストレージを消費します。

    変更追跡メタデータのクエリには、 SELECT ステートメントの CHANGES 句を使用するか、テーブルで1つ以上のストリームを作成し、クエリします。

  • FALSE は、テーブルの変更追跡を有効にしません。

デフォルト: FALSE

DEFAULT_DDL_COLLATION = 'collation_specification'

将来テーブルに追加される列を含む、テーブルの列のデフォルトの 照合仕様 を指定します。

パラメーターの詳細については、 DEFAULT_DDL_COLLATION をご参照ください。

COPY GRANTS

次の CREATE TABLE バリアントのいずれかを使用して新しいテーブルが作成されるときに、元のテーブルからのアクセス権限を保持することを指定します。

  • CREATE OR REPLACE TABLE

  • CREATE TABLE ... LIKE

  • CREATE TABLE ... CLONE

このパラメーターは、既存のテーブルから新しいテーブルにすべての権限(OWNERSHIP 以外)をコピーします。新しいテーブルは、スキーマ内のオブジェクトタイプに定義された将来の許可を継承 しません 。デフォルトでは、 CREATE TABLE ステートメントを実行するロールが新しいテーブルを所有します。

パラメーターが CREATE TABLE ステートメントに含まれていない場合、新しいテーブルは元のテーブルに付与された明示的なアクセス権限を 継承しません が、スキーマ内のオブジェクトタイプに定義された将来の権限を継承します。

注意:

  • データ共有 の場合、

    • 既存のテーブルが別のアカウントと共有されていた場合、置換テーブルも共有されます。

    • 既存のテーブルがデータコンシューマとしてアカウントと共有され、アクセスがアカウント内の他のロールにさらに許可された場合(親データベースの GRANT IMPORTED PRIVILEGES を使用)、置換テーブルにもアクセスが許可されます。

  • 置換テーブルの SHOW GRANTS 出力には、コピーされた権限の被付与者が、ステートメントが実行されたときの現在のタイムスタンプとともに、 CREATE TABLE ステートメントを実行したロールとしてリストされます。

  • 付与をコピーする操作は、 CREATE TABLE コマンドで(つまり、同じトランザクション内で)アトミックに発生します。

  • このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。

COPY TAGS

CREATE OR REPLACE ステートメント実行時に :doc:` タグ </user-guide/object-tagging/introduction>` を保持します。元のテーブルまたはその列にタグがあった場合、新しく作成されたテーブルおよびその列には引き続きタグがあります。

CREATE OR REPLACE ステートメントの列を変更するときの効果など、パラメーターの使用に関する情報については、 :ref:` COPY TAGS <label-create_table_usage_notes_copy_tags> の使用上の注意 ` をご参照ください。

COMMENT = 'string_literal'

テーブルのコメントを指定します。

デフォルト: 値なし

(コメントは列レベルまたは制約レベル、テーブルレベルで指定できることにご注意ください。それぞれの構文は少し異なります。)

ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )

テーブルに設定する 行アクセスポリシー を指定します。

このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。

AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , col_name ... ] ) ]

テーブルに設定する 集計ポリシー を指定します。テーブルに1つ以上の集計ポリシーを適用できます。

オプションの ENTITY KEY パラメーターを使用して、テーブル内でエンティティを一意に識別する列を定義します。詳細については、 集計ポリシーによるエンティティレベルのプライバシーの実装 をご参照ください。集計ポリシーには、1つ以上のエンティティキーを指定できます。

このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。

JOIN POLICY policy_name [ ALLOWED JOIN KEYS ( col_name [ , ... ] ) ]

テーブルに設定する 結合ポリシー を指定します。

オプションの ALLOWED JOIN KEYS パラメーターを使用して、このポリシーが有効な場合に結合列として使用できる列を定義します。詳細については、 結合ポリシー をご参照ください。

このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。

STORAGE LIFECYCLE POLICY policy_name ON ( col_name [ , col_name ... ] )

テーブルに添付する ストレージライフサイクルポリシー を指定します。

ON 句で指定された列は、ポリシー関数署名で定義された引数の数およびデータ型と一致する必要があります。Snowflakeはこれらの列を使用して、ポリシー式を評価し、アーカイブまたは期限切れにする行を決定します。

重要

アーカイブストレージポリシーをテーブルに添付すると、そのテーブルは、有効期間中、指定されたアーカイブティアに永続的に割り当てられます。新しいポリシーを適用してアーカイブティアを変更することはできません。たとえば、 ALTERTABLE...DROPSTORAGELIFECYCLEPOLICY 内の COOL のアーカイブティアで作成されたポリシーは指定できません。その後、テーブルを変更して、 COLD アーカイブティアで作成されたポリシーを追加します。テーブルのアーカイブティアを変更するには、Snowflakeサポートに連絡し、現在アーカイブされているデータの削除をリクエストしてください。その他の留意点については、 アーカイブストレージポリシー をご参照ください。

ストレージライフサイクルポリシーの作成と管理の詳細については、 ストレージライフサイクルポリシーの作成と管理 をご参照ください。

このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )

タグ の名前とタグ文字列の値を指定します。

タグ値は常に文字列であり、タグ値の最大文字数は256です。

ステートメントでのタグの指定に関する情報については、 タグの割り当て をご参照ください。

このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。

WITH CONTACT ( purpose = contact [ , purpose = contact ...] )

新しいオブジェクトを1つ以上の 連絡先 に関連付けます。

アクセス制御の要件

この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。

権限

オブジェクト

注意

CREATE TABLE

スキーマ

仮テーブルの作成には、 CREATE TABLE 権限は必要 ない ことに注意してください。

SELECT

テーブル、外部テーブル、ビュー

テーブルのクローンを作成したり、 CTAS ステートメントを実行したりする場合にのみ、クエリ対象のテーブルやビューで必要です。

APPLY

マスキングポリシー、行アクセスポリシー、タグ、ストレージライフサイクルポリシー

テーブルの作成時に、マスキングポリシー、行アクセスポリシー、オブジェクトタグ、ストレージライフサイクルポリシー、またはこうした ガバナンス 機能の任意の組み合わせを適用する場合にのみ必要です。

USAGE (外部ステージ)または READ (内部ステージ)

ステージ

CREATE TABLE ... USING TEMPLATE ステートメントを使用して、ステージングされたファイルからテーブル列の定義を取得するために必要です。

OWNERSHIP

テーブル

  • スキーマに既存のオブジェクトと同じ名前の仮オブジェクトを作成するには、ロールにオブジェクトの権限(OWNERSHIP)を付与するか継承する必要があります。

  • 既存 のテーブルに対して CREATE OR ALTER TABLE ステートメントを実行するために必要です。

OWNERSHIP is a special privilege on an object that is automatically granted to the role that created the object, but can also be transferred using the GRANT OWNERSHIP command to a different role by the owning role (or any role with the MANAGE GRANTS privilege).

Note that in a managed access schema, only the schema owner (i.e. the role with the OWNERSHIP privilege on the schema) or a role with the MANAGE GRANTS privilege can grant or revoke privileges on objects in the schema, including future grants.

スキーマ内のオブジェクトを操作するには、親データベースの少なくとも1つの権限と、親スキーマの少なくとも1つの権限が必要です。

指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。

セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。

使用上の注意

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

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

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

      重要

      OR REPLACE を使用することは、既存のテーブルで DROP TABLE を使用してから、同じ名前で新しいテーブルを作成することと同等です。ただし、ドロップされたテーブルは、システムから完全には削除 されません 。代わりに、Time Travel内で保持されます。Time Travelでドロップされたテーブルは復元できますが、アカウントのデータストレージにも寄与するため、これは重要です。詳細については、 Time TravelおよびFail-safeのストレージコスト をご参照ください。

      CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、単一のトランザクションで、古いオブジェクトが削除されて新しいオブジェクトが作成されます。

      これは、CREATE OR REPLACE TABLE 操作と同時に実行されるクエリが、古いテーブルバージョンまたは新しいテーブルバージョンのいずれかを使用することを意味します。

      テーブルを再作成または交換すると、変更データがドロップされます。テーブル上のストリームはすべて 古く なります。さらに、このテーブルを基になるテーブルとして持つビュー上のストリームはすべて古くなります。古いストリームは読み取れません。

  • OR REPLACEIF NOT EXISTS 句は互いに排他的です。両方を同じステートメントで使うことはできません。

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

  • CREATE OR ALTER TABLE:

    詳細については、 CREATE OR ALTER TABLE の使用上の注意 をご参照ください。

  • CREATE TABLE ... CLONE:

    ソーステーブルにクラスタリングキーがある場合は、新しいテーブルにクラスタリングキーがあります。デフォルトでは、ソーステーブルに対して自動クラスタリングが一時停止されていなくても、新しいテーブルに対して自動クラスタリングが一時停止されます。

  • CREATE TABLE ... FROM ARCHIVE OF:

    • このコマンドを使用するには、ソーステーブルに対する OWNERSHIP 権限が必要です。

    • 列の定義、ポリシー、タグ、その他の制約の指定はサポートされていません。Snowflakeは、ソーステーブルからテーブルスキーマ、ポリシー、タグ、および制約を自動的に取得します。

    • WHERE 句が必要です。アーカイブデータの読み取りはコストがかかるので、頻繁には実行しないでください。WHERE 句を使用して結果をフィルタリングすると、Snowflakeがアーカイブストレージから必要なデータのみを読み取るようにすることで、コストを最小限に抑えることができます。

    • Snowflakeがアーカイブストレージから取得するファイルの数を見積もるには、この操作の前に EXPLAIN コマンドを実行します。出力には、 createTableFromArchiveData 操作が含まれ、TableScan 操作の objects 列に ARCHIVE OF <table> と表示されます。詳細については、 EXPLAIN による検索コストの見積もり をご参照ください。

    • アーカイブストレージからのデータ取得履歴を表示するには、 ARCHIVE_STORAGE_DATA_RETRIEVAL_USAGE_HISTORY ビュー を使用します。

    • アーカイブストレージの COLD ティアからデータを取得するには、Snowflakeは最初に外部クラウドストレージからファイルを復元する必要があります。このプロセスには最大48時間かかる場合があります。

      このプロセスをサポートするには、次のパラメーターを適切に設定します。

      COLD ストレージティアの復元操作は、復元操作ごとに最大100万件のファイルをサポートします。

    • アーカイブストレージからデータを取得する CREATE TABLE 操作をキャンセルすると、取得コストが発生する可能性があります。

  • CREATE TABLE ... CHANGE_TRACKING = TRUE:

    変更の追跡が有効になっている場合、テーブルは操作の間ロックされます。ロックにより、関連する DDL/DML オペレーションの一部で遅延が発生する可能性があります。詳細については、 リソースのロック をご参照ください。

  • CREATE TABLE ... LIKE:

    ソーステーブルにクラスタリングキーがある場合は、新しいテーブルにクラスタリングキーがあります。デフォルトでは、ソーステーブルに対して自動クラスタリングが一時停止されていても、新しいテーブルに対して自動クラスタリングは一時停止されません。

  • CREATE TABLE ... AS SELECT (CTAS):

    • SELECT リストの列名のエイリアスが有効な列である場合、 CTAS ステートメントでは列定義は不要です。省略した場合、列の名前と型は基になるクエリから推測されます。

      CREATE TABLE <table_name> AS SELECT ...
      
      Copy

      または、次の構文を使用して名前を明示的に指定できます。

      CREATE TABLE <table_name> ( <col1_name> , <col2_name> , ... ) AS SELECT ...
      
      Copy

      指定する列名の数は、クエリ内の SELECT リストアイテムの数と一致する必要があります。列のタイプは、クエリによって生成されたタイプから推測されます。

    • クラスタリングキーが CTAS ステートメントで指定されている場合、

      • 列定義は必須であり、ステートメントで明示的に指定する必要があります。

      • デフォルトでは、ソーステーブルに対して自動クラスタリングが中断されていたとしても、新しいテーブルに対して 自動クラスタリング は有効になっています。

      • 新しいテーブルが作成されると、データはクラスター化されます。クラスター化されたテーブルは、ソート操作を含むクエリプランを生成し、クラスター化されていない同等のテーブルよりも作成に時間がかかります。たとえば、これらのコマンドの2番目のコマンドは、最初のコマンドよりも時間がかかる可能性があります。

        CREATE TABLE ctas_large_table
          AS SELECT * FROM large_table;
        
        CREATE TABLE ctas_clustered_large_table CLUSTER BY (timestamp)
          AS SELECT * FROM large_table;
        
        Copy

        あるいは、CTAS クエリの ORDER BY 句を使用して、行を並べ替えたテーブルを作成できます。

  • CREATE OR REPLACE ... TABLE TAGS

    • COPY TAGS と CREATE TABLE ... LIKE または CREATE TABLE ... CLONE ステートメントの併用はできません。

    • COPY TAGS と WITH TAG 句の併用はできません。

    • COPY TAGS の使用にタグに対する権限は必要ありません。

    • ステートメントでタグ付けされた列の名前を変更すると、新しいテーブルの列にはタグがなくなります。

    • タグ付き列のデータ型を変更した場合 --- たとえば、 NUMBER(8) から NUMBER(16) へ変更すると --- 新しいテーブルの列にはタグがなくなります。

    • ステートメントで列名を交換した場合、タグはその名前に基づく列に留まります。たとえば、列 a にのみタグがあり、次のコマンドを実行して列 ab の名前を交換したと仮定します。

      CREATE OR REPLACE TABLE dst1 COPY TAGS AS SELECT b AS a, a AS b FROM src1
      
      Copy

      a 列のみ新しいテーブルでもまだタグ付けされていますが、ソーステーブルの列 b からのデータが含まれています。

  • トランザクション内では、 DDL ステートメント( CREATE TEMPORARY/TRANSIENT TABLE を含む)は、 DDL ステートメント自体を実行する前にトランザクションをコミットします。次に、 DDL ステートメントは独自のトランザクションで実行されます。DDL ステートメントの後の次のステートメントが、新しいトランザクションを開始します。したがって、単一のトランザクション内で仮テーブルまたは一時テーブルの作成、使用、およびドロップはできません。トランザクション内で仮テーブルまたは一時テーブルを使用する場合は、トランザクションの前にテーブルを作成し、トランザクションの後にテーブルをドロップします。

  • テーブルを再作成すると(オプションの OR REPLACE キーワードを使用)、その履歴が削除され、テーブル上のストリームが古くなります。古いストリームは読み取れません。

  • テーブルの列構造がポリシーで指定された列と一致する場合は、条件付き列を使用する単一のマスキングポリシーを複数のテーブルに適用できます。

  • 1つ以上のテーブル列にマスキングポリシーを使用してテーブルを作成する場合、またはテーブルに行アクセスポリシーを追加する場合は、 POLICY_CONTEXT 関数を使用して、マスキングポリシーによって保護されている列と行アクセスポリシーによって保護されているテーブルに対するクエリをシミュレートします。

  • WITH STORAGE LIFECYCLE POLICY 句でテーブルを作成する場合:

    • ポリシーを適用するために必要な権限を持っている必要があります。必要な権限については、 ストレージライフサイクルポリシー権限 をご参照ください。

    • テーブルには、ストレージライフサイクルポリシーを1つだけ添付できます。

    • 列の数はポリシー関数署名の引数の数と一致する必要があり、列データは引数の型に対応する必要があります。

    • テーブル列の名前を変更しても、関連付けられたポリシーは影響を受けません。Snowflakeは列 IDs を使用してポリシーをテーブルに関連付けます。

    • ストレージライフサイクルポリシー式を評価して適用するために、Snowflakeは内部的および一時的にテーブルに対するガバナンスポリシーをバイパスします。

  • メタデータについて、

    注意

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

CREATE OR ALTER TABLE の使用上の注意

  • 制限事項

    • 現在、永続テーブル、仮テーブル、一時テーブルのみをサポートしています。読み取り専用テーブル、外部テーブル、動的テーブル、 Apache Iceberg™ テーブル、ハイブリッドテーブルはサポートされて いません

    • ALTER TABLE コマンドのすべての制限が適用されます。

    • 現在、以下はサポートして いません

      • CREATE TABLE ... AS SELECT (CTAS)バリアント構文。

      • CREATE TABLE ... USING TEMPLATE バリアント構文。

      • CREATE TABLE ... LIKE バリアント構文。

      • CREATE TABLE ... CLONE バリアント構文。

  • テーブルのパラメーターとプロパティ

    • 変更されたテーブル定義で以前に設定されていたプロパティやパラメーターがない場合は、そのプロパティやパラメーターの設定が解除されます。

    • 明示的な パラメーター 値の設定を解除すると、デフォルトのパラメーター値に設定されます。パラメーターがテーブルを含むスキーマまたはデータベースに設定されている場合、テーブルはスキーマまたはデータベースに設定されているパラメーター値を継承します。

  • データガバナンス

    • CREATE OR ALTER TABLE ステートメントを使用したテーブルや列に対する、タグやポリシーの設定や設定解除はサポートされて いません

      既存のポリシーやタグは、 CREATE OR ALTER ステートメントによって変更されることは ありません

  • 制約事項

    インライン主キーを設定または設定解除すると、それに応じて列のNULL値の許容が変更されます。これは、 CREATE TABLE コマンドの動作と一致しますが、 ALTER TABLE コマンドの動作とは異なります。

    • 新しい列は列リストの最後にのみ追加できます。

    • 列名は変更できません。列名を変更しようとすると、その列はドロップされ、新しい列が追加されます。

    • 列のデフォルト値を変更できるのは、シーケンスを使用する場合のみです。

    • 列のデフォルトのシーケンス(例: SET DEFAULT seq_name.NEXTVAL)は、その列がすでにシーケンスがある場合にのみ変更することができます。

    • 列の変更に関する詳細については、 ALTER TABLE ... ALTER COLUMN をご参照ください。

  • 照合

    • 照合順序仕様は変更できません。

    • CREATE OR ALTER TABLE コマンドで DEFAULT_DDL_COLLATION パラメーターを設定すると、既存の列のデフォルト照合順序仕様が設定され、 CREATE OR ALTER TABLE コマンドで CREATE TABLE コマンドと同じ結果が得られるようになります。したがって、 CREATE OR ALTER TABLE コマンドを使用して、既存のテキスト列があるテーブルに DEFAULT_DDL_COLLATION パラメーターを設定することはできません。しかし、テーブルの DEFAULT_DDL_COLLATION パラメーターを変更する際に、既存の列を明示的に照合することができます。

      たとえば、新しいテーブル my_table を作成し、テーブルのデフォルト照合順序を「fr」に設定します。

      CREATE OR ALTER TABLE my_table (
        a INT PRIMARY KEY,
        b VARCHAR(20)
      )
      DEFAULT_DDL_COLLATION = 'fr';
      
      Copy

      b の照合順序の指定は「fr」であり、変更することはできません。テーブル my_table のデフォルト照合順序仕様を変更するには、 CREATE OR ALTER ステートメントでテキスト列 b の照合順序を明示的に設定する必要があります。

      CREATE OR ALTER TABLE my_table (
        a INT PRIMARY KEY,
        b VARCHAR(200) COLLATE 'fr'
      )
      DEFAULT_DDL_COLLATION = 'de';
      
      Copy
  • アトミック性

    現在、 CREATE OR ALTER TABLE コマンドはアトミック性を保証しません。これは、 CREATE OR ALTER TABLE ステートメントが実行中に失敗した場合、変更のサブセットがテーブルに適用された可能性があることを意味します。部分的な変更の可能性がある場合の多くで、エラーメッセージには以下のテキストが含まれます。

    CREATE OR ALTER execution failed. Partial updates may have been applied.
    

    たとえば、 A 列をドロップし、 B 列を新たにテーブルに追加しようとしていてステートメントが中止された場合、 A 列はドロップされたが、 B 列は追加されなかった可能性があります。

    注釈

    変更が部分的に適用されても、結果的にテーブルはまだ有効な状態にあり、 ALTER TABLE ステートメントを追加して、元の変更セットを完了させることができます。

    部分更新から復元するために、Snowflakeは以下の復元メカニズムを推奨しています。

    • 前方修正

      • CREATE OR ALTER TABLE ステートメントを再実行します。2回目の試行でステートメントが成功すれば、ターゲット状態が達成されます。

      • エラーメッセージを調査します。可能であれば、エラーを修正し、 CREATE OR ALTER TABLE ステートメントを再実行します。

    • ロールバック

      前方修正が不可能な場合は、部分的な変更を手動でロールバックすることをSnowflakeはお勧めします。

      • DESCRIBE TABLESHOW TABLES コマンドを使用してテーブルの状態を調査します。どの部分的な変更(ある場合)が適用されたかを判断します。

      • 部分的な変更が適用された場合は、適切な ALTER TABLE ステートメントを実行し、テーブルを元の状態に戻します。

        注釈

        場合によっては、部分的な変更を元に戻せないことがあります。詳細については、 ALTER TABLE ... ALTER COLUMN トピックにある、列プロパティの変更でサポートされるアクションとサポートされないアクションをご参照ください。

    • 部分的な更新からの復元にヘルプが必要な場合は、 Snowflakeサポート にお問い合わせください。

基本的な例

現在のデータベースに単純なテーブルを作成し、テーブルに行を挿入します。

CREATE TABLE mytable (amount NUMBER);

+-------------------------------------+
| status                              |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+

INSERT INTO mytable VALUES(1);

SHOW TABLES like 'mytable';

+---------------------------------+---------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
| created_on                      | name    | database_name | schema_name | kind  | comment | cluster_by | rows | bytes | owner        | retention_time |
|---------------------------------+---------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------|
| Mon, 11 Sep 2017 16:32:28 -0700 | MYTABLE | TESTDB        | PUBLIC      | TABLE |         |            |    1 |  1024 | ACCOUNTADMIN | 1              |
+---------------------------------+---------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+

DESC TABLE mytable;

+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name   | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| AMOUNT | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

単純なテーブルを作成し、テーブルとテーブル内の列の両方にコメントを指定します。

CREATE TABLE example (col1 NUMBER COMMENT 'a column comment') COMMENT='a table comment';

+-------------------------------------+
| status                              |
|-------------------------------------|
| Table EXAMPLE successfully created. |
+-------------------------------------+

SHOW TABLES LIKE 'example';

+---------------------------------+---------+---------------+-------------+-------+-----------------+------------+------+-------+--------------+----------------+
| created_on                      | name    | database_name | schema_name | kind  | comment         | cluster_by | rows | bytes | owner        | retention_time |
|---------------------------------+---------+---------------+-------------+-------+-----------------+------------+------+-------+--------------+----------------|
| Mon, 11 Sep 2017 16:35:59 -0700 | EXAMPLE | TESTDB        | PUBLIC      | TABLE | a table comment |            |    0 |     0 | ACCOUNTADMIN | 1              |
+---------------------------------+---------+---------------+-------------+-------+-----------------+------------+------+-------+--------------+----------------+

DESC TABLE example;

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment          |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------|
| COL1 | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | a column comment |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------+
Copy

CTAS 例

既存のテーブルから選択してテーブルを作成します。

CREATE TABLE mytable_copy (b) AS SELECT * FROM mytable;

DESC TABLE mytable_copy;

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| B    | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

CREATE TABLE mytable_copy2 AS SELECT b+1 AS c FROM mytable_copy;

DESC TABLE mytable_copy2;

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| C    | NUMBER(39,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

SELECT * FROM mytable_copy2;

+---+
| C |
|---|
| 2 |
+---+
Copy

既存のテーブルから選択してテーブルを作成するより高度な例。この例では、新しいテーブルの summary_amount 列の値は、ソーステーブルの2つの列から派生しています。

CREATE TABLE testtable_summary (name, summary_amount) AS SELECT name, amount1 + amount2 FROM testtable;
Copy

段階的なParquetデータファイルから列を選択して、テーブルを作成します。

CREATE OR REPLACE TABLE parquet_col (
  custKey NUMBER DEFAULT NULL,
  orderDate DATE DEFAULT NULL,
  orderStatus VARCHAR(100) DEFAULT NULL,
  price VARCHAR(255)
)
AS SELECT
  $1:o_custkey::number,
  $1:o_orderdate::date,
  $1:o_orderstatus::text,
  $1:o_totalprice::text
FROM @my_stage;

+-----------------------------------------+
| status                                  |
|-----------------------------------------|
| Table PARQUET_COL successfully created. |
+-----------------------------------------+

DESC TABLE parquet_col;

+-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name        | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| CUSTKEY     | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| ORDERDATE   | DATE         | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| ORDERSTATUS | VARCHAR(100) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| PRICE       | VARCHAR(255) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

CREATE TABLE ... LIKE の例

別のテーブルと同じ列定義を持つが、行がないテーブルを作成します。

CREATE TABLE mytable (amount NUMBER);

INSERT INTO mytable VALUES(1);

SELECT * FROM mytable;

+--------+
| AMOUNT |
|--------|
|      1 |
+--------+

CREATE TABLE mytable_2 LIKE mytable;

DESC TABLE mytable_2;

+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name   | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| AMOUNT | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

SELECT * FROM mytable_2;

+--------+
| AMOUNT |
|--------|
+--------+
Copy

パラメーターとプロパティを設定する CREATE TABLE の例

複数列のクラスタリングキーを持つテーブルを作成します。

CREATE TABLE mytable (date TIMESTAMP_NTZ, id NUMBER, content VARIANT) CLUSTER BY (date, id);

SHOW TABLES LIKE 'mytable';

+---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+
| created_on                      | name    | database_name | schema_name | kind  | comment | cluster_by       | rows | bytes | owner        | retention_time |
|---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------|
| Mon, 11 Sep 2017 16:20:41 -0700 | MYTABLE | TESTDB        | PUBLIC      | TABLE |         | LINEAR(DATE, ID) |    0 |     0 | ACCOUNTADMIN | 1              |
+---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+
Copy

テーブルの列の照合を指定します。

CREATE OR REPLACE TABLE collation_demo (
  uncollated_phrase VARCHAR, 
  utf8_phrase VARCHAR COLLATE 'utf8',
  english_phrase VARCHAR COLLATE 'en',
  spanish_phrase VARCHAR COLLATE 'es');

INSERT INTO collation_demo (
      uncollated_phrase, 
      utf8_phrase, 
      english_phrase, 
      spanish_phrase) 
   VALUES (
     'pinata', 
     'pinata', 
     'pinata', 
     'piñata');
Copy

CREATE TABLE ... USING TEMPLATE の例

Avro、Parquet、または ORC データを含むステージングされたファイルのセットから列定義が派生するテーブルを作成します。

ステートメントで参照されている mystage ステージと my_parquet_format ファイル形式がすでに存在している必要があることに注意してください。ファイルのセットは、ステージ定義で参照されるクラウドストレージの場所に既にステージングされている必要があります。

次の例では、ステージングされたファイルから検出されたスキーマを使用してテーブルを作成し、列を order_id で並べ替えます。これは、 INFER_SCHEMA トピックの例に基づいて構築されています。

CREATE TABLE mytable
  USING TEMPLATE (
    SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*))
    WITHIN GROUP (ORDER BY order_id)
      FROM TABLE(
        INFER_SCHEMA(
          LOCATION=>'@mystage',
          FILE_FORMAT=>'my_parquet_format'
        )
      ));
Copy

order_id による列の並べ替えは、ステージングされたファイルすべてが1つのスキーマを共有する場合にのみ適用されることに注意してください。ステージングされたデータファイルのセットに、列名が共有されている複数のスキーマが含まれている場合は、 order_id 列で表される順序が単一のファイルと一致しない可能性があります。

注釈

ARRAY_AGG(OBJECT_CONSTRUCT())* を使用すると、返される結果が128 MB よりも大きい場合にエラーになる可能性があります。大きな結果セットの場合は * の使用を避け、クエリには必要な列(COLUMN NAMETYPENULLABLE)のみを使用することをお勧めします。ORDER_ID を使用する場合は、オプションの列 WITHIN GROUP (ORDER BY order_id) を含めることができます。

仮テーブルの例

セッションの終了時に自動的にドロップされる仮テーブルを作成します。

CREATE TEMPORARY TABLE demo_temporary (i INTEGER);
CREATE TEMP TABLE demo_temp (i INTEGER);
Copy

他のベンダーとの互換性のために、Snowflakeは以下のキーワードを TEMPORARY の同義語として使用することもサポートしています。

CREATE LOCAL TEMPORARY TABLE demo_local_temporary (i INTEGER);
CREATE LOCAL TEMP TABLE demo_local_temp (i INTEGER);

CREATE GLOBAL TEMPORARY TABLE demo_global_temporary (i INTEGER);
CREATE GLOBAL TEMP TABLE demo_global_temp (i INTEGER);

CREATE VOLATILE TABLE demo_volatile (i INTEGER);
Copy

CREATE OR ALTER TABLE の例

CREATE OR ALTER TABLE コマンドを使用してテーブル my_table を作成します。

CREATE OR ALTER TABLE my_table(a INT);
Copy

注釈

CREATE OR ALTER TABLE ステートメントを実行できるのは、テーブル my_table に対する OWNERSHIP 権限を持つロールだけです。

テーブル my_table を変更し、列を追加して修正し、 DATA_RETENTION_TIME_IN_DAYS と DEFAULT_DDL_COLLATION パラメーターを設定します。

CREATE OR ALTER TABLE my_table(
    a INT PRIMARY KEY,
    b VARCHAR(200)
  )
  DATA_RETENTION_TIME_IN_DAYS = 5
  DEFAULT_DDL_COLLATION = 'de';
Copy

DATA_RETENTION_TIME_IN_DAYS パラメーターの設定を解除します。変更されたテーブル定義にパラメーターがない場合は、パラメーターの設定が解除されます。この場合、テーブルの DATA_RETENTION_TIME_IN_DAYS パラメーターの設定を解除すると、デフォルト値の 1 にリセットされます。

CREATE OR ALTER TABLE my_table(
    a INT PRIMARY KEY,
    c VARCHAR(200)
  )
  DEFAULT_DDL_COLLATION = 'de';
Copy

CREATE OR ALTER TABLE コマンドにより、列リストの最後に列を追加することができます。既存の列の名前を変更しようとすると、既存の列はドロップされ、新しい列名の新しい列が追加されます。元の列にデータが存在する場合は、データが失われる可能性があります。

次の例はこの動作を示しています。

  1. テーブルを作成します。

    CREATE OR ALTER TABLE my_table(
        a INT PRIMARY KEY,
        b INT
      );
    
    Copy
  2. テーブル my_table にデータを挿入します。

    INSERT INTO my_table VALUES (1, 2), (2, 3);
    
    SELECT * FROM my_table;
    
    Copy

    戻り値:

    +---+---+
    | A | B |
    |---+---|
    | 1 | 2 |
    | 2 | 3 |
    +---+---+
    
  3. b の名前の変更を試みます。

    CREATE OR ALTER TABLE my_table(
        a INT PRIMARY KEY,
        c INT
      );
    
    Copy

    b がドロップされ、列 c が追加されます。

    SELECT * FROM my_table;
    
    Copy

    戻り値:

    +---+------+
    | A | C    |
    |---+------|
    | 1 | NULL |
    | 2 | NULL |
    +---+------+
    

    注釈

    Time Travel を使用して、ドロップされた列を復元できます。

インライン主キーを設定または設定解除すると、CREATE TABLE コマンドの動作と整合性が取れるように列のNULL値の許容が変更されますが、 ALTER TABLE コマンドの動作とは異なります。たとえば、 ALTER TABLE ステートメントを使用して列に主キー制約を追加しても、列のNULL値の許容は変わりません。

次の例はこの動作を示しています。

  1. テーブルを作成します。

    CREATE TABLE t(a INT);
    
    Copy
  2. テーブルを変更して、PRIMARY KEY 制約を追加します。

    CREATE OR ALTER TABLE t(a INT PRIMARY KEY);
    
    Copy

    a が主キーになり、 NOT NULL に設定されます。

    DESC TABLE t;
    
    Copy

    戻り値:

    +------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    | name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
    |------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
    | A    | NUMBER(38,0) | COLUMN | N     | NULL    | Y           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
    +------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    
  3. テーブル t を置き換えます。

    CREATE OR REPLACE TABLE t(a INT);
    
    Copy
  4. NULL 値を挿入します。

    INSERT INTO t VALUES (null);
    
    Copy
  5. a に主キー制約を追加します。

    a の NULL 値により、以下のステートメントが失敗します。

    CREATE OR ALTER TABLE t(a INT PRIMARY KEY);
    
    Copy

    戻り値:

    001471 (42601): SQL compilation error:
    Column 'A' contains null values. Not null constraint cannot be added.