ALTER TABLE¶
既存のテーブルのプロパティ、列、または制約を変更します。
- こちらもご参照ください。
- ALTER TABLE ... ALTER COLUMN、 CREATE TABLE、 DROP TABLE、 SHOW TABLES、 DESCRIBE TABLE 
構文¶
ALTER TABLE [ IF EXISTS ] <name> RENAME TO <new_table_name>
ALTER TABLE [ IF EXISTS ] <name> SWAP WITH <target_table_name>
ALTER TABLE [ IF EXISTS ] <name> { clusteringAction | tableColumnAction | constraintAction  }
ALTER TABLE [ IF EXISTS ] <name> dataMetricFunctionAction
ALTER TABLE [ IF EXISTS ] <name> dataGovnPolicyTagAction
ALTER TABLE [ IF EXISTS ] <name> extTableColumnAction
ALTER TABLE [ IF EXISTS ] <name> searchOptimizationAction
ALTER TABLE [ IF EXISTS ] <name> SET
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE  } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ CONTACT <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ]
  [ COMMENT = '<string_literal>' ]
ALTER TABLE [ IF EXISTS ] <name> UNSET {
                                       DATA_RETENTION_TIME_IN_DAYS         |
                                       MAX_DATA_EXTENSION_TIME_IN_DAYS     |
                                       CHANGE_TRACKING                     |
                                       DEFAULT_DDL_COLLATION               |
                                       ENABLE_SCHEMA_EVOLUTION             |
                                       CONTACT <purpose>                   |
                                       COMMENT                             |
                                       }
                                       [ , ... ]
条件:
clusteringAction ::= { CLUSTER BY ( <expr> [ , <expr> , ... ] ) /* RECLUSTER is deprecated */ | RECLUSTER [ MAX_SIZE = <budget_in_bytes> ] [ WHERE <condition> ] /* { SUSPEND | RESUME } RECLUSTER is valid action */ | { SUSPEND | RESUME } RECLUSTER | DROP CLUSTERING KEY }tableColumnAction ::= { ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> [ { DEFAULT <default_value> | { AUTOINCREMENT | IDENTITY } /* AUTOINCREMENT (or IDENTITY) is supported only for */ /* columns with numeric data types (NUMBER, INT, FLOAT, etc.). */ /* Also, if the table is not empty (that is, if the table contains */ /* any rows), only DEFAULT can be altered. */ [ { ( <start_num> , <step_num> ) | START <num> INCREMENT <num> } ] [ { ORDER | NOORDER } ] } ] [ inlineConstraint ] [ COLLATE '<collation_specification>' ] | RENAME COLUMN <col_name> TO <new_col_name> | ALTER | MODIFY [ ( ] [ COLUMN ] <col1_name> DROP DEFAULT , [ COLUMN ] <col1_name> SET DEFAULT <seq_name>.NEXTVAL , [ COLUMN ] <col1_name> { [ SET ] NOT NULL | DROP NOT NULL } , [ COLUMN ] <col1_name> [ [ SET DATA ] TYPE ] <type> , [ COLUMN ] <col1_name> COMMENT '<string>' , [ COLUMN ] <col1_name> UNSET COMMENT [ , [ COLUMN ] <col2_name> ... ] [ , ... ] [ ) ] | DROP [ COLUMN ] [ IF EXISTS ] <col1_name> [, <col2_name> ... ] } inlineConstraint ::= [ NOT NULL ] [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY | { [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } } [ <constraint_properties> ]列を変更するための詳細な構文と例については、 ALTER TABLE ... ALTER COLUMN をご参照ください。.
インライン制約を作成/変更するための詳細な構文と例については、 CREATE | ALTER TABLE ... CONSTRAINT をご参照ください。
dataMetricFunctionAction ::= SET DATA_METRIC_SCHEDULE = { '<num> MINUTE' | 'USING CRON <expr> <time_zone>' | 'TRIGGER_ON_CHANGES' } | UNSET DATA_METRIC_SCHEDULE | { ADD | DROP } DATA METRIC FUNCTION <metric_name> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] ) [ EXPECTATION <expectation_name> ( <expression> ) [, <expectation_name> ( <expression> ) [ , ... ] ] ] [ EXECUTE AS ROLE <role_name> ] [ , <metric_name_2> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] ) ] [ EXPECTATION <expectation_name> ( <expression> ) [, <expectation_name> ( <expression> ) [ , ... ] ] ] [ EXECUTE AS ROLE <role_name> ] | MODIFY DATA METRIC FUNCTION <metric_name> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] ) { SUSPEND | RESUME } [ , <metric_name_2> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] ) { SUSPEND | RESUME } ] | MODIFY DATA METRIC FUNCTION <metric_name> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] ) { ADD | MODIFY } EXPECTATION <expectation_name> ( <expression> ) [, <expectation_name> ( <expression> ) [ , ... ] ] | MODIFY DATA METRIC FUNCTION <metric_name> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] ) DROP EXPECTATION <expectation_name> [ , <expectation_name> [ , ... ] ]dataGovnPolicyTagAction ::= { SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ] | UNSET TAG <tag_name> [ , <tag_name> ... ] } | { ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] ) | DROP ROW ACCESS POLICY <policy_name> | DROP ROW ACCESS POLICY <policy_name> , ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] ) | DROP ALL ROW ACCESS POLICIES } | { SET AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [, ... ] ) ] [ FORCE ] | UNSET AGGREGATION POLICY } | { SET JOIN POLICY <policy_name> [ FORCE ] | UNSET JOIN POLICY } | ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col1_name> , <cond_col_1> , ... ) ] ] [ [ WITH ] PROJECTION POLICY <policy_name> ] [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ] | { { ALTER | MODIFY } [ COLUMN ] <col1_name> SET MASKING POLICY <policy_name> [ USING ( <col1_name> , <cond_col_1> , ... ) ] [ FORCE ] | UNSET MASKING POLICY } | { { ALTER | MODIFY } [ COLUMN ] <col1_name> SET PROJECTION POLICY <policy_name> [ FORCE ] | UNSET PROJECTION POLICY } | { ALTER | MODIFY } [ COLUMN ] <col1_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ] , [ COLUMN ] <col2_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ] | { ALTER | MODIFY } [ COLUMN ] <col1_name> UNSET TAG <tag_name> [ , <tag_name> ... ] , [ COLUMN ] <col2_name> UNSET TAG <tag_name> [ , <tag_name> ... ]extTableColumnAction ::= { ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> AS ( <expr> ) | RENAME COLUMN <col_name> TO <new_col_name> | DROP [ COLUMN ] [ IF EXISTS ] <col1_name> [, <col2_name> ... ] }constraintAction ::= { ADD outoflineConstraint | RENAME CONSTRAINT <constraint_name> TO <new_constraint_name> | { ALTER | MODIFY } { CONSTRAINT <constraint_name> | PRIMARY KEY | UNIQUE | FOREIGN KEY } ( <col_name> [ , ... ] ) [ [ NOT ] ENFORCED ] [ VALIDATE | NOVALIDATE ] [ RELY | NORELY ] | DROP { CONSTRAINT <constraint_name> | PRIMARY KEY | UNIQUE | FOREIGN KEY } ( <col_name> [ , ... ] ) [ CASCADE | RESTRICT ] } 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> ]アウトライン制約の作成/変更の詳細な構文と例については、 CREATE | ALTER TABLE ... CONSTRAINT をご参照ください。
searchOptimizationAction ::= { ADD SEARCH OPTIMIZATION [ ON <search_method_with_target> [ , <search_method_with_target> ... ] ] | DROP SEARCH OPTIMIZATION [ ON { <search_method_with_target> | <column_name> | <expression_id> } [ , ... ] ] }詳細については、 検索最適化アクション(searchOptimizationAction) をご参照ください。
パラメーター¶
- name
- 変更するテーブルの識別子。識別子にスペースまたは特殊文字が含まれる場合は、文字列全体を二重引用符で囲む必要があります。二重引用符で囲まれた識別子も大文字と小文字が区別されます。 
- RENAME TO new_table_name
- 指定されたテーブルの名前を、スキーマ内の他のテーブルで現在使用されていない新しい識別子に変更します。 - テーブル識別子の詳細については、 識別子の要件 をご参照ください。 - オプションでオブジェクトの名前を変更して、オブジェクトを別のデータベースやスキーマに移動できます。これを実行するには、新しいデータベース名やスキーマ名をそれぞれ - db_name.schema_name.object_nameまたは- schema_name.object_nameの形式で含む、修飾された- new_name値を指定します。- 注釈 - 宛先データベースやスキーマはすでに存在している必要があります。また、同じ名前のオブジェクトが宛先データベースにすでに存在することはできません。存在する場合、ステートメントはエラーを返します。 
- オブジェクトを管理アクセススキーマに移動することは、オブジェクトの所有者(つまり、オブジェクトに対して OWNERSHIP 権限を持つロール)がターゲットスキーマも所有している場合を 除き 禁止されています。 
 - オブジェクト(テーブル、列など)の名前が変更されると、それを参照する他のオブジェクトも新しい名前で更新する必要があります。 
- SWAP WITH target_table_name
- スワップは、1つのトランザクションで2つのテーブルの名前を変更します。 - 永続テーブルまたは一時テーブルを、作成されたユーザーセッションの期間のみ存続する仮テーブルと交換することは許可されていないことに注意してください。この制限により、仮テーブルが永続テーブルまたは一時テーブルと交換され、既存の永続テーブルまたは一時テーブルの名前が、仮テーブルと同じになった場合に発生する可能性のある名前の競合が防止されます。永続テーブルまたは一時テーブルを仮テーブルと交換するには、3つの - ALTER TABLE ... RENAME TOステートメントを使用します。テーブル名を- aから- cに、- bから- aに、そして- cから- bに変更します。
注釈
テーブルの名前を変更するか、2つのテーブルを交換するには、操作の実行に使用するロールにテーブルに対する OWNERSHIP 権限が必要です。さらに、テーブルの名前を変更するには、テーブルのスキーマに対する CREATE TABLE 権限が必要です。
- SET ...
- テーブルに設定する1つ以上のプロパティ/パラメーターを指定します(空白、コンマ、または改行で区切られます)。 - DATA_RETENTION_TIME_IN_DAYS = integer
- Time Travelのテーブルの保持期間を変更するオブジェクトレベルのパラメーター。詳細については、 Time Travelの理解と使用 および 仮テーブルと一時テーブルの使用 をご参照ください。 - このパラメーターの詳細な説明、およびオブジェクトパラメーターの詳細については、 パラメーター をご参照ください。 - 値: - Standard Edition: - 0または- 1
- Enterprise Edition: - 永続テーブルの場合は - 0~- 90
- 仮および一時テーブルの場合は - 0または- 1
 
 - 注釈 - 0の値は、テーブルのTime Travelを効果的に無効化します。
- MAX_DATA_EXTENSION_TIME_IN_DAYS = integer
- Snowflakeがテーブルのデータ保持期間を延長してテーブル上のストリームが古くなるのを防ぐことができる最大日数を指定するオブジェクトパラメーター。 - このパラメーターの詳細については、 MAX_DATA_EXTENSION_TIME_IN_DAYS をご参照ください。 
- CHANGE_TRACKING = TRUE | FALSE
- テーブルの変更追跡を有効または無効にするように指定します。 
- DEFAULT_DDL_COLLATION = 'collation_specification'
- テーブルに追加された新しい列のデフォルトの 照合仕様 を指定します。 - パラメーターを設定しても、既存の列の照合仕様は 変更されません 。 - パラメーターの詳細については、 DEFAULT_DDL_COLLATION をご参照ください。 
- 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_NAMEと- PARSE_HEADERを使用する場合は、- ERROR_ON_COLUMN_COUNT_MISMATCHをfalseに設定する必要があります。
 - CONTACT purpose = contact [ , purpose = contact ... ]
- 既存のオブジェクトを、1つ以上の 連絡先 に関連付けます。 - CONTACTプロパティを同じステートメント内の他のプロパティと一緒に設定することはできません。 
 - COMMENT = 'string_literal'
- テーブルのコメントを追加するか、既存のコメントを上書きします。 
 
注釈
CREATE STAGE、 ALTER STAGE、 CREATE TABLE、または ALTER TABLE コマンドを使用して、ファイルフォーマットオプションやコピーオプションを指定しないでください。コピーオプションの指定には、 COPY INTO <テーブル> コマンドを使用することをお勧めします。
- UNSET ...
- テーブルの設定を解除する1つ以上のプロパティ/パラメーターを指定し、それらをデフォルトにリセットします。 - DATA_RETENTION_TIME_IN_DAYS
- MAX_DATA_EXTENSION_TIME_IN_DAYS
- CHANGE_TRACKING
- DEFAULT_DDL_COLLATION
- ENABLE_SCHEMA_EVOLUTION
- CONTACT purpose
- COMMENT
 - 同じステートメント内の他のプロパティと一緒にCONTACTプロパティの設定を解除することはできません。 
クラスタリングアクション(clusteringAction)¶
- CLUSTER BY ( expr [ , expr , ... ] )
- 1つ以上のテーブル列または列式をテーブルのクラスタリングキーとして指定(または変更)します。これらは、自動クラスタリングによってクラスタリングが維持される列/式です。 - 重要 - クラスタリングキーは、すべてのテーブルに対して意図または推奨されているわけでは ありません。通常、非常に大きな(つまり、マルチテラバイト)テーブルに役立ちます。 - テーブルのクラスタリングキーを指定する前に、 Snowflakeテーブル構造について をご参照ください。 
- RECLUSTER ...
- 非推奨 - クラスタリングキーが定義されているテーブルの手動の増分再クラスタリングを実行します。 - MAX_SIZE = budget_in_bytes
- 非推奨 --- より大きなウェアハウスを使用して、より効果的な手動再クラスタリングを実現します - 再クラスタ化するテーブルのデータ量の上限(バイト単位)を指定します。 
- WHERE condition
- テーブル内のデータを再クラスター化する条件または範囲を指定します。 
 - 注釈 - テーブルに対して OWNERSHIP または INSERT 権限を持つロールのみがテーブルを再クラスター化できます。 
- SUSPEND | RESUME RECLUSTER
- テーブルの 自動クラスタリング を有効または無効にします。 
- DROP CLUSTERING KEY
- テーブルのクラスタリングキーをドロップします。 
クラスタリングキーと再クラスタリングの詳細については、 Snowflakeテーブル構造について をご参照ください。
テーブル列アクション(tableColumnAction)¶
- ADD [ COLUMN ] [ IF NOT EXISTS ] col_name col_data_type.- [ DEFAULT default_value | AUTOINCREMENT ... ].- [ inlineConstraint ]- [ COLLATE 'collation_specification' ].- [ [ WITH ] MASKING POLICY policy_name ].- [ [ WITH ] PROJECTION POLICY policy_name ].- [ [ WITH ] TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] ) ] [ , ...]
- 新しい列を追加します。デフォルト値、インライン制約、 照合仕様、マスキングポリシー、および/または1つ以上のタグを指定できます。 - 追加している列のデフォルト値はリテラル値でなければなりません。式や関数が返す値にはできません。例えば、次のコマンドは予期されるエラーを返します。 - ALTER TABLE t1 ADD COLUMN c5 VARCHAR DEFAULT 12345::VARCHAR; - 002263 (22000): SQL compilation error: Invalid column default expression [CAST(12345 AS VARCHAR(134217728))] - 最初にテーブルを作成する際には、デフォルト値として式を使用できますが、列を追加する際には使用できません。 - 列のデフォルト値は、列のデータ型と一致する必要があります。データ型が一致しないデフォルト値を設定しようとすると、エラーで失敗します。例: - ALTER TABLE t1 ADD COLUMN c6 DATE DEFAULT '20230101'; - 002023 (22000): SQL compilation error: Expression type does not match column data type, expecting DATE but got VARCHAR(8) for column C6 - テーブル列アクションの詳細については、次をご参照ください。 - ADD COLUMN 操作は、同じコマンドにある複数の列で実行できます。 - 列がすでに存在するかどうかわからない場合は、列を追加する際に IF NOT EXISTS を指定できます。列がすでに存在する場合、 ADD COLUMN が既存の列に影響を与えることはなく、エラーにはなりません。 - 注釈 - 新しい列に次のいずれかも指定する場合は、 IF NOT EXISTS を指定できません。 - DEFAULT 、 AUTOINCREMENT 、または IDENTITY 
- UNIQUE、 PRIMARY KEY、または FOREIGN KEY 
 
- RENAME COLUMN col_name to new_col_name
- 指定した列の名前を、テーブル内の他の列に現在使用されていない新しい名前に変更します。 - クラスタリングキーの一部である列の名前を変更することはできません。 - オブジェクト(テーブル、列など)の名前が変更されると、それを参照する他のオブジェクトも新しい名前で更新する必要があります。 
- DROP COLUMN [ IF EXISTS ] col_name [ CASCADE | RESTRICT ]
- 指定した列をテーブルから削除します。 - 列がすでに存在するかどうかわからない場合は、列をドロップする際に IF EXISTS を指定できます。列が存在しない場合、 DROP COLUMN は何の影響もなく、エラーにもなりません。 - 列のドロップは、メタデータのみの操作です。マイクロパーティションはすぐには書き換えられないため、列で使用されているスペースはすぐには解放されません。通常、個々のマイクロパーティション内のスペースは、次にマイクロパーティションが再書き込みされるときに解放されます。これは通常、 DML (INSERT、 UPDATE、 DELETE)または再クラスタリングによって書き込みが完了した時点です。 
データメトリック関数アクション(dataMetricFunctionAction)¶
- DATA_METRIC_SCHEDULE ...
- データメトリック関数を定期的に実行するスケジュールを指定します。 - 'num MINUTE'
- データメトリックの実行間に挿入される待機時間の間隔(分単位)を指定します。正の整数のみを受け入れます。 - num M構文もサポートしています。- データメトリック関数には、以下の値のいずれかを使用します。 - 5- 15、- 30、- 60、- 720、または- 1440。
- 'USING CRON expr time_zone'
- データメトリック関数を定期的に実行するためのcron式とタイムゾーンを指定します。標準のcronユーティリティ構文のサブセットをサポートします。 - タイムゾーンのリストについては、 tzデータベースタイムゾーンのリスト をご参照ください。 - cron式は以下のフィールドで構成され、周期間隔は少なくとも5分にする必要があります。 - # __________ minute (0-59) # | ________ hour (0-23) # | | ______ day of month (1-31, or L) # | | | ____ month (1-12, JAN-DEC) # | | | | _ day of week (0-6, SUN-SAT, or L) # | | | | | # | | | | | * * * * * - 次の特殊文字がサポートされています。 - *
- ワイルドカード。フィールドのオカレンスを指定します。 
- L
- 「最後」の略。曜日フィールドで使用すると、特定の月の「最後の金曜日」(「5L」)などの構造を指定できます。月の日フィールドでは、月の最後の日を指定します。 
- /{n}
- 特定の時間単位の nth インスタンスを示します。時間の各クォンタムは独立して計算されます。たとえば、月フィールドに - 4/3が指定されている場合、データメトリック関数は4月、7月、および10月にスケジュールされます(つまり、年の4番目の月から始まる3か月ごと)。その後も同じスケジュールが維持されます。つまり、データメトリック関数は1月(10月の実行から3か月後)に実行されるようにスケジュールされては いません。
 - 注釈 - cron式は現在、指定されたタイムゾーンに対してのみ評価します。アカウントの TIMEZONE パラメーター値を変更(またはユーザーレベルまたはセッションレベルで値を設定)しても、データメトリック関数のタイムゾーンは変更 されません。 
- cron式は、データメトリック関数のすべての 有効な 実行時間を定義します。Snowflakeは、このスケジュールに基づいてデータメトリック関数を実行しようとします。ただし、次回の有効な実行時間が始まる前に以前の実行が完了していない場合、有効な実行時間はスキップされます。 
- cron式に特定の月の日と曜日の両方が含まれている場合、データメトリック関数は月の日または曜日の いずれか を満たす日にスケジュールされます。たとえば、 - DATA_METRIC_SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC'は、月の10日から20日、およびそれらの日付以外の火曜日または木曜日の 0AM にデータメトリック関数をスケジュールします。
- cronでの時間の最小粒度は分です。 - cron式で定義された分の間にデータメトリック関数が再開された場合、最初にスケジュールされたタスクの実行は、cron式のインスタンスの次回発生です。たとえば、毎日午前0時( - USING CRON 0 0 * * *)に実行するようにスケジュールされたデータメトリック関数が、午前0時+5秒(- 00:00:05)に再開される場合、最初のタスクの実行は次の午前0時にスケジュールされます。
 
- 'TRIGGER_ON_CHANGES'
- 新しい行の挿入や行の削除など、 DML の操作 によりテーブルが変更される場合に、 DMF が実行されることを指定します。 - 以下のオブジェクトに対して - 'TRIGGER_ON_CHANGES'を指定できます。- 動的テーブル 
- 外部テーブル 
- Apache Iceberg™ テーブル 
- 通常のテーブル 
- 仮テーブル 
- 一時テーブル 
 - ビューに - 'TRIGGER_ON_CHANGES'を指定することはできません。- 再クラスタリング の結果としてテーブルが変更される場合は、 DMF の実行をトリガーしません。 
 
- { ADD | DROP } DATA METRIC FUNCTION metric_name
- テーブルまたはビューに追加する、またはテーブルまたはビューからドロップするデータメトリック関数の識別子。 - ON ( col_name [ , ... ] [ , TABLE( table_name( col_name [ , ... ] ) ) ] )
- データメトリック関数を関連付けるテーブルまたはビュー列。列のデータ型は、データメトリック関数定義で指定された列のデータ型と一致しなければなりません。 - データメトリック関数が引数として2つ目のテーブルを受け取る場合は、テーブルとその列の完全修飾名を指定します。 
- EXPECTATION expectation_name ( expression ) [, expectation_name ( expression ) [ , ... ] ]
- 列とDMFとの関連付けについて、1つ以上の :doc:`期待値</user-guide/data-quality-expectations>`を定義します。 
- [ , metric_name_2 ON ( col_name [ , ... ] [ , TABLE( table_name( col_name [ , ... ] ) ) ] ) ]
- テーブルまたはビューに追加するデータメトリック関数。各データメトリック関数とその指定列を区切るには、コンマを使用します。 - データメトリック関数が引数として2つ目のテーブルを受け取る場合は、テーブルとその列の完全修飾名を指定します。 
- EXECUTE AS ROLE role_name
- 
DMF を実行するロールを指定します。ロールには、テーブルまたはビューに対する SELECT 権限が必要です。 詳細については、 テーブルまたはビューに対する必須権限 をご参照ください。 
 
- MODIFY DATA METRIC FUNCTION metric_name
- 修正するデータメトリック関数の識別子。 - ON ( col_name [ , ... ] [ , TABLE( table_name( col_name [ , ... ] ) ) ] )
- データメトリック関数に関連した列を指定します。 データメトリック関数が引数として2つ目のテーブルを受け取る場合は、テーブルとその列の完全修飾名を指定します。 
- { SUSPEND | RESUME }
- 指定した列のデータ測定機能を一時停止または再開します。データメトリック機能がテーブルまたはビューに設定されると、データメトリック機能は自動的にスケジュールに含まれます。 - SUSPENDはスケジュールからデータメトリック関数を削除します。
- RESUMEは中断していた日付測定機能をスケジュールに戻します。
 
- { ADD | MODIFY } EXPECTATION expectation_name ( expression ) [, expectation_name ( expression ) [ , ... ] ]
- 列とDMFとの関連付けについて、1つ以上の :doc:`期待値</user-guide/data-quality-expectations>`を定義するか、変更します。 
- DROP EXPECTATION expectation_name [ , expectation_name [ , ... ] ]
- 列とDMFとの関連付けから、指定された期待値を削除します。 
- [ , metric_name_2 ON ( col_name [ , ... ] [ , TABLE(col_name [ , ... ] ) ] ) ]
- 変更する追加のデータメトリック関数。各データメトリック関数とその指定列を区切るには、コンマを使用します。データメトリック関数が引数として2つ目のテーブルを受け取る場合は、テーブルとその列の完全修飾名を指定します。 
 
外部テーブル列アクション(extTableColumnAction)¶
他のすべての外部テーブル変更については、 ALTER EXTERNAL TABLE をご参照ください。
- ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> AS ( <expr> ) [, ...]
- 新しい列を外部テーブルに追加します。 - 列がすでに存在するかどうかわからない場合は、列を追加する際に IF NOT EXISTS を指定できます。列がすでに存在する場合、 ADD COLUMN が既存の列に影響を与えることはなく、エラーにはなりません。 - この操作は、同じコマンドにある複数の列で実行できます。 - col_name
- 列識別子(つまり名前)を指定する文字列。テーブル識別子のすべての要件は、列識別子にも適用されます。 - 詳細については、 識別子の要件 をご参照ください。 
- col_type
- 列のデータ型を指定する文字列(定数)。データ型は、列の - exprの結果と一致する必要があります。- テーブル列に指定できるデータ型の詳細については、 SQL データ型リファレンス をご参照ください。 
- expr
- 列の式を指定する文字列。クエリすると、列はこの式から派生した結果を返します。 - 外部テーブルの列は、明示的な式を使用して定義される仮想列です。VALUE 列および/または METADATA$FILENAME 疑似列を使用し、式として仮想列を追加します。 - VALUE:
- 外部ファイルの単一の行を表す VARIANT 型の列。 - CSV:
- VALUE 列は、各行を、列の位置で識別される要素を持つオブジェクトとして構造化します(つまり、 - {c1: <column_1_value>, c2: <column_2_value>, c3: <column_1_value> ...}です)。- たとえば、ステージングされた CSV ファイル内の最初の列を参照する - mycolという名前の VARCHAR 列を追加します。- mycol varchar as (value:c1::varchar) 
- 半構造化データ:
- 要素の名前と値を二重引用符で囲みます。ドット表記を使用して、 VALUE 列のパスを走査します。 - たとえば、次がステージングされたファイル内の半構造化データの単一行を表すとします。 - { "a":"1", "b": { "c":"2", "d":"3" } } - ステージングされたファイル内のネストされた繰り返し - c要素を参照する- mycolという名前の VARCHAR 列を追加します。- mycol varchar as (value:"b"."c"::varchar) 
 
- METADATA$FILENAME:
- 外部テーブルに含まれるステージングされた各データファイルの名前を識別する疑似列。ステージ内のパスも含まれます。 
 
 
- RENAME COLUMN col_name to new_col_name
- 外部テーブル内の他の列で現在使用されていない新しい名前に、指定した列の名前を変更します。 
- DROP COLUMN [ IF EXISTS ] col_name
- 指定した列を外部テーブルから削除します。 - 列がすでに存在するかどうかわからない場合は、列をドロップする際に IF EXISTS を指定できます。列が存在しない場合、 DROP COLUMN は何の影響もなく、エラーにもなりません。 
制約アクション(constraintAction)¶
- ADD CONSTRAINT
- テーブルの1つ以上の列にアウトラインの整合性制約を追加します。(列の)インライン制約を追加するには、 列アクション (このトピック)をご参照ください。 
- RENAME CONSTRAINT constraint_name TO new_constraint_name
- 指定された制約の名前を変更します。 
- ALTER | MODIFY CONSTRAINT ...
- 指定された制約のプロパティを変更します。 
- DROP CONSTRAINT constraint_name | PRIMARY KEY | UNIQUE | FOREIGN KEY ( col_name [ , ... ] ) [ CASCADE | RESTRICT ]
- 指定した列または列セットの指定した制約をドロップします。 
制約を追加または変更するための詳細な構文と例については、 CREATE | ALTER TABLE ... CONSTRAINT をご参照ください。
データガバナンス方針とタグアクション(dataGovnPolicyTagAction)¶
- TAG tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ]
- タグ の名前とタグ文字列の値を指定します。 - タグ値は常に文字列であり、タグ値の最大文字数は256です。 - ステートメントでのタグの指定に関する情報については、 オブジェクトのタグクォータ をご参照ください。 
- policy_name
- ポリシーの識別子。スキーマに対して一意である必要があります。 
以下の句は、テーブル、ビュー、イベントテーブルなど、行アクセスポリシーをサポートするすべての種類のテーブルに適用されます。簡略化するために、句は単に「テーブル」を指しています。
ADD ROW ACCESS POLICY policy_name ON (col_name [ , ... ])
行アクセスポリシーをテーブルに追加します。
少なくとも1つの列名を指定する必要があります。追加の列は、各列名をコンマで区切って指定できます。この式を使用して、イベントテーブルと外部テーブルの両方に行アクセスポリシーを追加します。
DROP ROW ACCESS POLICY policy_name
テーブルから行アクセスポリシーをドロップします。
テーブルからポリシーをドロップするには、この句を使用します。
DROP ROW ACCESS POLICY policy_name, ADD ROW ACCESS POLICY policy_name ON ( col_name [ , ... ] )
テーブルに設定されている行アクセスポリシーをドロップし、1つの SQL ステートメントで同じテーブルに行アクセスポリシーを追加します。
DROP ALL ROW ACCESS POLICIES
テーブルから すべての:doc:` 行アクセスポリシー</user-guide/security-row-using>`の関連付けをドロップします。
この式は、イベントテーブルからポリシーをドロップする 前に、スキーマから行アクセスポリシーをドロップするときに役立ちます。この式を使用して、テーブルから行アクセスポリシーの関連付けをドロップします。
スナップショットの作成時に、行アクセスポリシーがテーブルに適用され、そのポリシーが後でドロップされたとします。:doc:`スナップショット</user-guide/snapshots>`からテーブルを復元した後、DROPALLROWACCESSPOLICIES 句を使用してALTERTABLEコマンドを実行するまでクエリはできません。
SET AGGREGATION POLICY policy_name
[ ENTITY KEY (col_name [ , ... ]) ] [ FORCE ]
テーブルに 集計ポリシー を割り当てます。
オプションの ENTITY KEY パラメーターを使用して、テーブル内でエンティティを一意に識別する列を定義します。詳細については、 集計ポリシーによるエンティティレベルのプライバシーの実装 をご参照ください。
既存の集計ポリシーを新しい集計ポリシーにアトミックに置き換えるには、オプションの FORCE パラメーターを使用します。
UNSET AGGREGATION POLICY
テーブルから集計ポリシーをデタッチします。
SET JOIN POLICY policy_name
[ FORCE ]
結合ポリシー をテーブルに割り当てます。
オプションの FORCE パラメーターを使用して、既存の結合ポリシーを新しい結合ポリシーにアトミックに置き換えます。
UNSET JOIN POLICY
テーブルから結合ポリシーを削除します。
- { ALTER | MODIFY } [ COLUMN ] ...
- USING ( col_name , cond_col_1 ... )
- 条件付きマスキングポリシー SQL 式に渡す引数を指定します。 - リストの最初の列は、データをマスクまたはトークン化するポリシー条件の列を指定し、マスキングポリシーが設定されている列と一致する 必要 があります。 - 追加の列は、最初の列でクエリが実行されたときに、クエリ結果の各行のデータをマスクするかトークン化するかを決定するために評価する列を指定します。 - USING 句が省略されている場合、Snowflakeは条件付きマスキングポリシーを通常の マスキングポリシー として扱います。 
- FORCE
- 単一のステートメント内で、列に現在設定されているマスキングまたは投影ポリシーを別のポリシーに置き換えます。 - マスキングポリシーで - FORCEキーワードを使用するには、 ALTER TABLE ステートメント(つまり STRING)内のポリシーの データ型 が、列に現在設定されているマスキングポリシーのデータ型(つまり STRING)と一致している必要があります。- 現在列にマスキングポリシーが設定されていない場合は、このキーワードを指定しても効果はありません。 - 詳細については、 列のマスキングポリシーを置き換える または 投影ポリシーの置き換え をご参照ください。 
 
検索最適化アクション(searchOptimizationAction)¶
- ADD SEARCH OPTIMIZATION
- テーブル全体の、またはオプションの ON 句を指定した場合は特定の列の 検索最適化 を追加します。 - 注釈 - 特にテーブル内のデータが頻繁に変更される場合、検索最適化は維持にコストがかかる可能性があります。詳細については、 検索最適化のコスト見積もりおよび管理 をご参照ください。 
- マテリアライズドビューに検索最適化を追加しようとすると、Snowflakeはエラーメッセージを返します。 
 
- ON search_method_with_target [, search_method_with_target ... ]
- (テーブル全体ではなく)特定の列または VARIANT フィールドに対して検索最適化を構成したいことを指定します。 - search_method_with_targetには、次の構文の式を使用します。- <search_method>( <target> [ , <target> , ... ] [ , ANALYZER => '<analyzer_name>' ] ) - 条件: - search_methodは、特定の型の述語に対するクエリを最適化する次の方法のいずれかを指定します。- 検索方法 - 説明 - FULL_TEXT- VARCHAR (テキスト)、 VARIANT 、 ARRAY 、および OBJECT の型を使用する述語。 - EQUALITY- 等価および IN 述語。 - SUBSTRING- 部分文字列と正規表現に一致する述語(例えば、 [ NOT ] LIKE、 [ NOT ] ILIKE、 [ NOT ] RLIKE、および REGEXP_LIKE)。 - GEO- GEOGRAPHY 型を使用する述語。 
- targetは、列、 VARIANT フィールド、またはアスタリスク(*)を指定します。- search_methodの値に応じて、次に挙げる型の列または VARIANT フィールドを指定できます。- 検索方法 - サポートされるターゲット - FULL_TEXT- VARIANTs 内のフィールドへのパスを含む、 VARCHAR (テキスト)、 VARIANT、 ARRAY、および OBJECT データ型の列。 - EQUALITY- VARIANTs 内のフィールドへのパスを含む、数値、文字列、バイナリ、および VARIANT データ型の列。 - SUBSTRING- VARIANTs のフィールドへのパスを含む、文字列または VARIANT データ型の列。 - EQUALITYで説明したように、フィールドへのパスを指定します。ネストされたフィールドの検索も同様に改善されます。- GEO- GEOGRAPHY データ型の列。 - VARIANT フィールドを指定するには、 ドットまたはブラケット表記 (例えば - my_column:my_field_name.my_nested_field_nameや- my_column['my_field_name']['my_nested_field_name'])を使用します。フィールドへのコロン区切りのパスも使用できます(例:- my_column:my_field_name:my_nested_field_name)。- VARIANT フィールドを指定すると、そのフィールドの下にネストされたすべてのフィールドに構成が適用されます。たとえば、 - ON EQUALITY(src:a.b)を指定したとします。- この構成により、クエリ - on src:a.bおよびネストされたフィールド(例:- src:a.b.c、- src:a.b.c.dなど)を改善できます。
- この構成は、 - src:a.b接頭辞を使用しないクエリ(例:- src:a、- src:zなど)には影響しません。
 - テーブル内の該当するすべての列をターゲットとして指定するには、アスタリスク( - *)を使用します。- 特定の検索方法に対して、アスタリスクと特定の列名の 両方 を指定することはできません。ただし、さまざまな検索方法でアスタリスクを指定できます。 - たとえば、次の式を指定できます。 - -- Allowed ON SUBSTRING(*) ON EQUALITY(*), SUBSTRING(*), GEO(*) - 次の式は指定できません。 - -- Not allowed ON EQUALITY(*, c1) ON EQUALITY(c1, *) ON EQUALITY(v1:path, *) ON EQUALITY(c1), EQUALITY(*) 
 - search_methodが- FULL_TEXTの場合、- ANALYZER => 'analyzer_name'がテキスト解析器の名前を指定します。- FULL_TEXT検索メソッドを使用し、 SEARCH または SEARCH_IP 関数を使用してクエリを実行すると、アナライザは検索語(および検索対象の列のテキスト)をトークンに分割します。検索文字列から抽出されたトークンのいずれかが、検索対象の列またはフィールドから抽出されたトークンと一致する場合、その行はマッチします。アナライザーは、- FULL_TEXT検索メソッドが使用されていない場合や、 SEARCH または SEARCH_IP 関数が使用されていないクエリには関係ありません。- アナライザーは、文字列を特定の区切り文字を見つけたところで区切ることによって、文字列をトークン化します。これらの区切り文字は結果のトークンには含まれず、空のトークンは抽出されません。 - このパラメーターは、以下の値を1つ以上受け付けます。 - DEFAULT_ANALYZER: 以下の区切り文字に基づいてテキストをトークンに分割します。 - 文字 - ユニコード - 説明 - U+0020- スペース - [- U+005B- 左角括弧 - ]- U+005D- 右角括弧 - ;- U+003B- セミコロン - <- U+003C- 小なり符号 - >- U+003E- 大なり記号 - (- U+0028- 左括弧 - )- U+0029- 右括弧 - {- U+007B- 左中括弧 - }- U+007D- 右中括弧 - |- U+007C- 垂直バー - !- U+0021- 感嘆符 - ,- U+002C- コンマ - '- U+0027- アポストロフィ - "- U+0022- 引用符 - *- U+002A- アスタリスク - &- U+0026- アンパサンド - ?- U+003F- 疑問符 - +- U+002B- プラス記号 - /- U+002F- スラッシュ - :- U+003A- コロン - =- U+003D- 等号 - @- U+0040- サイン - .- U+002E- ピリオド(フルストップ) - -- U+002D- ハイフン - $- U+0024- ドル記号 - %- U+0025- パーセント記号 - \- U+005C- バックスラッシュ - _- U+005F- アンダースコア(低いライン) - \n- U+000A- 改行(ラインフィード) - \r- U+000D- キャリッジリターン - \t- U+0009- 水平タブ 
- UNICODE_ANALYZER: 空白と特定の句読点を区切り文字として扱うユニコードの分割規則に基づいてトークン化します。これらの内部ルールは、(さまざまな言語による)自然言語検索のために設計されています。たとえば、デフォルトのアナライザは、 IP アドレスのピリオドや短縮形のアポストロフィを区切り記号として扱いますが、ユニコードアナライザーはそうしません。 アナライザーを使用した検索動作の調整 をご参照ください。 - Unicode Text Segmentation アルゴリズムについての詳細は https://unicode.org/reports/tr29/をご参照ください。 
- NO_OP_ANALYZER: データもクエリ文字列もトークン化しません。検索語は、大文字小文字の区別を含め、列またはフィールドの全文と完全に一致する必要があります。そうでない場合、 SEARCH 関数は FALSE を返します。クエリ文字列が複数のトークンを含んでいるように見えても(例えば、 - 'sky blue')、列またはフィールドはクエリー文字列全体と正確に等しくなければなりません。この場合、- 'sky blue'だけが一致します。- 'sky'と- 'blue'は一致しません。
- ENTITY_ANALYZER: IP アドレス検索用にデータをトークン化します。 - このアナライザーは、 SEARCH_IP 関数で実行されたクエリにのみ使用されます。 
 
 - ターゲットに複数の検索方法を指定するには、コンマを使用して後続の各メソッドとターゲットを区切ります。 - ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), EQUALITY(c2, c3); - 同じテーブルに対して ALTER TABLE ... ADD SEARCH OPTIMIZATION ON ... コマンドを複数回実行すると、後続の各コマンドがテーブルの既存の構成に追加されます。たとえば、次のコマンドを実行するとします。 - ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2); ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c3, c4); - これにより、列c1、c2、c3、およびc4の等価述語がテーブルの構成に追加されます。これは、次のコマンドを実行するのと同じです。 - ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2, c3, c4); - 例については、 特定の列に対する検索最適化の有効化 をご参照ください。 
- DROP SEARCH OPTIMIZATION
- テーブル全体の、またはオプションの ON 句を指定した場合は特定の列から 検索最適化 を削除します。 - 注釈 - テーブルに検索最適化プロパティがある場合、テーブルをドロップしてからドロップを解除すると、検索最適化プロパティが保持されます。 
- テーブルから検索最適化プロパティを削除した後に再度追加すると、最初に追加したときと同じコストがかかります。 
 
- ON search_method_with_target | column_name | expression_id [ , ... ]
- (テーブル全体の検索最適化を削除するのではなく)特定の列または VARIANT フィールドの検索最適化構成を削除することを指定します。 - ドロップする列構成を識別するには、次のいずれかを指定します。 - search_method_with_targetには、1つ以上の特定のターゲット(列または VARIANT フィールド)のクエリを最適化する方法を指定します。前に説明されている構文 を使用します。
- column_nameには、検索最適化用に構成された列の名前を指定します。列名を指定すると、その列の VARIANT フィールドを使用する式を含む、その列のすべての式がドロップされます。
- expression_idには、 DESCRIBE SEARCH OPTIMIZATION コマンドの出力にリストされた式の ID を指定します。
 - これらを複数指定するには、項目間にコンマを使用します。 - ターゲット、列名、および式 IDs を使用して、検索方法を自由に組み合わせて指定できます。 - 例については、 特定の列に対する検索最適化のドロップ をご参照ください。 
使用上の注意: 一般¶
- テーブルへの変更は、そのテーブルで作成されたビューに自動的に反映されません。たとえば、テーブル内の列をドロップし、その列を含むようにビューが定義されている場合、ビューは無効になります。ビューは列をドロップするように調整されていません。 
- 列をドロップしても、列のストレージスペースはすぐに解放されません。 - 各マイクロパーティションのスペースは、そのマイクロパーティションの再書き込みが行われるまで解放されません。そのマイクロパーティション内の1行以上に書き込み操作(挿入、更新、削除など)を行うと、マイクロパーティションが再書き込みされます。スペースを強制的に取り戻したい場合は、次の手順に従います。 - CREATE TABLE AS SELECT (CTAS) ステートメントを使用して、保持したい古いテーブルの列のみを含む新しいテーブルを作成します。 
- 古いテーブルの DATA_RETENTION_TIME_IN_DAYS パラメーターを - 0に設定します(オプション)。
- テーブルをドロップします。 
 
- テーブルがTime Travel機能によって保護されている場合、Time Travelの保持期間が終了するまで、Time Travelストレージで使用されるスペースは解放されません。 
 
- デフォルト値を持つ新しい列が既存の行を持つテーブルに追加されると、既存のすべての行にデフォルト値が入力されます。 
- 関数を含むデフォルト値を持つ新しい列を追加することは、現在サポートされていません。次のエラーが返されます。 - Invalid column default expression (expr)
- テーブルを変更するには、テーブルの所有権限を持つロールを使用する必要があります。 
- テーブルにクラスタリングを追加するには、テーブルを含むスキーマとデータベースに対する USAGE または OWNERSHIP 権限も必要です。 
- マスキングポリシーの場合、 - USING句と- FORCEキーワードはどちらもオプションです。どちらも、列にマスキングポリシーを設定する必要はありません。- USING句と- FORCEキーワードは、個別にまたは一緒に使用できます。詳細については、以下をご参照ください。
- テーブルの列構造がポリシーで指定された列と一致する場合は、条件付き列を使用する単一のマスキングポリシーを複数のテーブルに適用できます。 
- マスキングポリシーを使用して1つ以上のテーブル列を変更する場合、または行アクセスポリシーを使用してテーブル自体を変更する場合は、 POLICY_CONTEXT 関数を使用して、マスキングポリシーによって保護されている列と、行アクセスポリシーによって保護されているテーブルに対するクエリをシミュレートします。 
 
- 行アクセスポリシーの場合、 - Snowflakeは、単一の SQL ステートメントで行アクセスポリシーの追加とドロップをサポートしています。 - たとえば、テーブルにすでに設定されている行アクセスポリシーを別のポリシーに置き換えるには、最初に行アクセスポリシーをドロップしてから、新しい行アクセスポリシーを追加します。 
- 特定のリソース(つまり、テーブルまたはビュー)の場合、行アクセスポリシーを - ADDまたは- DROPするには、スキーマに対する APPLY ROW ACCESS POLICY 権限、 または リソースに対する OWNERSHIP 権限と行アクセスポリシーリソースに対する APPLY 権限が必要です。
- テーブルまたはビューは、一度に1つの行アクセスポリシーでのみ保護できます。ポリシー本体が、行アクセスポリシーによって保護されているテーブルまたはビューの列、またはマスキングポリシーによって保護されている列を参照している場合、ポリシーの追加は失敗します。 - 同様に、マスキングポリシー本体が、行アクセスポリシーまたは別のマスキングポリシーによって保護されているテーブルを参照している場合、テーブル列へのマスキングポリシーの追加は失敗します。 
- 行アクセスポリシーは、システムビューまたはテーブル関数には適用できません。 
- 他の DROP <オブジェクト> 操作と同様に、行アクセスポリシーが追加されていないリソースから行アクセスポリシーをドロップしようとすると、Snowflakeはエラーを返します。 
- オブジェクトに行アクセスポリシーと1つ以上のマスキングポリシーの両方がある場合は、行アクセスポリシーが最初に評価されます。 
 
- 外部キーを作成する場合、 REFERENCES 句の列は、主キーの列と同じ順序でリストする必要があります。例: - CREATE TABLE parent ... CONSTRAINT primary_key_1 PRIMARY KEY (c_1, c_2) ... CREATE TABLE child ... CONSTRAINT foreign_key_1 FOREIGN KEY (...) REFERENCES parent (c_1, c_2) ... - どちらの場合も、列の順序は - c_1, c_2です。外部キーの列の順序が異なっていた場合(例:- c_2, c_1)、外部キーを作成する試みは失敗していました。
- メタデータについて、 - 注意 - Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。 
- ALTER TABLE ... CHANGE_TRACKING = TRUE - 変更の追跡を有効にするためにテーブルが変更されると、テーブルは操作の間ロックされます。ロックにより、関連する DDL/DML オペレーションの一部で遅延が発生する可能性があります。詳細については、 リソースのロック をご参照ください。 
 
- ハイブリッドテーブルでのインデックス: - ALTER TABLE コマンドを使用してハイブリッドテーブルの UNIQUE または FOREIGN KEY 制約を追加または削除すると、対応するインデックスも作成または削除されます。ハイブリッドテーブルのインデックスについては、 CREATE INDEX をご参照ください。 
- FOREIGN KEY 制約は、同じデータベースに格納されているハイブリッドテーブル間でのみサポートされています。ハイブリッドテーブルをデータベース間で移動することはできません。ハイブリッドテーブルで定義された PRIMARY KEY、 UNIQUE、 FOREIGN KEY 制約は、 RELY プロパティが - TRUEとしてマークされています。
- インデックスで使用されている列は、対応するインデックスがドロップされる前にドロップすることはできません。 
 
使用上の注意: データメトリック関数¶
- DMF をテーブルに追加します。
- テーブルにデータメトリック関数を追加する前に、以下を実行する必要があります。 - データメトリック関数の実行スケジュールを設定します。詳細については、 DATA_METRIC_SCHEDULE をご参照ください。 
- データメトリック関数を呼び出した結果を格納するイベントテーブルを設定します。詳細については、 データ測定関数の結果表示 をご参照ください。 
- 共有テーブルまたはビューにはデータメトリック関数を設定できないため、テーブルまたはビューが共有に付与されていないことを確認してください。 
 - その他の情報は次のとおりです。 - データメトリック関数はテーブル、外部ビュー、またはマテリアライズドビューに追加できます。動的テーブルなど、他の種類のテーブルにデータメトリック関数を設定することはできません。 
- 列を指定する場合、Snowflakeは順序位置を使用します。テーブルまたはビューにデータメトリック関数を追加した後に列の名前を変更しても、データメトリック関数と列の関連付けは有効です。 
- 1つの列に追加できるデータメトリック関数は1つのみです。たとえば、 NULL_COUNT データメトリック関数を単一の列に2回追加することはできません。 
- 列を参照するデータメトリック関数を追加した後に列をドロップすると、Snowflakeはデータメトリック関数を評価できません。 
- 仮想列の参照はサポートされていません。 
 
- DMF をスケジュールします
- スケジュールが設定されてから有効になるまでに10分かかります。 - 同様に、 DMF の設定が解除されスケジューリングの変更が有効になるまでに10分かかります。詳細については、 DMF 実行スケジュール をご参照ください。 
例¶
次のセクションでは、 ALTER COLUMN コマンドの使用例を示します。
テーブル名の変更¶
次の例では、 t1 という名前のテーブルを作成します。
CREATE OR REPLACE TABLE t1(a1 number);
SHOW TABLES LIKE 't1';
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| created_on                    | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes | owner  | retention_time | change_tracking | is_external | enable_schema_evolution | owner_role_type | is_event | budget |
|-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------|
| 2023-10-19 10:37:04.858 -0700 | T1   | TESTDB        | MY_SCHEMA   | TABLE |         |            |    0 |     0 | PUBLIC | 1              | OFF             | N           | N                       | ROLE            | N        | NULL   |
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
次のステートメントは、テーブル名を tt1 に変更します。
ALTER TABLE t1 RENAME TO tt1;
SHOW TABLES LIKE 'tt1';
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| created_on                    | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes | owner  | retention_time | change_tracking | is_external | enable_schema_evolution | owner_role_type | is_event | budget |
|-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------|
| 2023-10-19 10:37:04.858 -0700 | TT1  | TESTDB        | MY_SCHEMA   | TABLE |         |            |    0 |     0 | PUBLIC | 1              | OFF             | N           | N                       | ROLE            | N        | NULL   |
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
テーブルの交換¶
次のステートメントは、 t1 および t2 という名前のテーブルを作成します。
CREATE OR REPLACE TABLE t1(a1 NUMBER, a2 VARCHAR, a3 DATE);
CREATE OR REPLACE TABLE t2(b1 VARCHAR);
DESC TABLE t1;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | DATE              | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
DESC TABLE t2;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
次のステートメントは、テーブル t1 とテーブル t2 を交換します。
ALTER TABLE t1 SWAP WITH t2;
DESC TABLE t1;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
DESC TABLE t2;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | DATE              | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
列の追加¶
次の例では、 t1 という名前のテーブルを作成します。
CREATE OR REPLACE TABLE t1(a1 NUMBER);
DESC TABLE t1;
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
次のステートメントは、このテーブルに a2 という名前の列を追加します。
ALTER TABLE t1 ADD COLUMN a2 NUMBER;
次のステートメントは、 a3 という名前の列に NOT NULL 制約を追加します。
ALTER TABLE t1 ADD COLUMN a3 NUMBER NOT NULL;
次のステートメントは、 a4 という名前の列にデフォルト値と NOT NULL 制約を追加します。
ALTER TABLE t1 ADD COLUMN a4 NUMBER DEFAULT 0 NOT NULL;
次のステートメントは、言語固有の 照合仕様 を使用して、 a5 という名前の VARCHAR 列を追加します。
ALTER TABLE t1 ADD COLUMN a5 VARCHAR COLLATE 'en_US';
DESC TABLE t1;
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type                              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0)                      | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0)                      | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A5   | VARCHAR(16777216) COLLATE 'en_us' | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
次のステートメントは IF NOT EXISTS 句を使用して、列が存在しない場合にのみ a2 という名前の列を追加します。a2 という名前の列が存在します。IF NOT EXISTS 句を指定すると、ステートメントがエラーで失敗するのを防ぐことができます。
ALTER TABLE t1 ADD COLUMN IF NOT EXISTS a2 NUMBER;
DESCRIBE TABLE コマンドの出力に示されているように、上記のステートメントが a2 という名前の既存の列に影響を与えることはありません。
DESC TABLE t1;
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type                              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0)                      | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0)                      | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A5   | VARCHAR(16777216) COLLATE 'en_us' | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
列の名前の変更¶
次のステートメントは、列 a1 の名前を b1 に変更します。
ALTER TABLE t1 RENAME COLUMN a1 TO b1;
DESC TABLE t1;
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0) | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
列のドロップ¶
次のステートメントは、列 a2 をドロップします。
ALTER TABLE t1 DROP COLUMN a2;
DESC TABLE t1;
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0) | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
次のステートメントは IF EXISTS 句を使用して、列が存在する場合にのみ a2 という名前の列をドロップします。a2 という名前の列は存在しません。IF EXISTS 句を指定すると、ステートメントがエラーで失敗するのを防ぐことができます。
ALTER TABLE t1 DROP COLUMN IF EXISTS a2;
DESCRIBE TABLE コマンドの出力に示されているように、上記のステートメントが既存のテーブルに影響を与えることはありません。
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0) | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
外部テーブルの列の追加、名前変更、ドロップ¶
次のステートメントは、 exttable1 という名前の外部テーブルを作成します。
CREATE EXTERNAL TABLE exttable1
  LOCATION=@mystage/logs/
  AUTO_REFRESH = true
  FILE_FORMAT = (TYPE = PARQUET)
  ;
DESC EXTERNAL TABLE exttable1;
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
次のステートメントは、外部テーブルに a1 という名前の新しい列を追加します。
ALTER TABLE exttable1 ADD COLUMN a1 VARCHAR AS (value:a1::VARCHAR);
DESC EXTERNAL TABLE exttable1;
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
| A1        | VARCHAR(16777216) | VIRTUAL   | Y     | NULL    | N           | N          | NULL  | TO_CHAR(GET(VALUE, 'a1'))                                | NULL                  |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
次のステートメントは、 a1 列の名前を b1 に変更します。
ALTER TABLE exttable1 RENAME COLUMN a1 TO b1;
DESC EXTERNAL TABLE exttable1;
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
| B1        | VARCHAR(16777216) | VIRTUAL   | Y     | NULL    | N           | N          | NULL  | TO_CHAR(GET(VALUE, 'a1'))                                | NULL                  |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
次のステートメントは、 b1 という名前の列をドロップします。
ALTER TABLE exttable1 DROP COLUMN b1;
DESC EXTERNAL TABLE exttable1;
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
クラスタリングキーの順序変更¶
次のステートメントは t1 という名前のテーブルを作成し、 id 列と date 列でクラスタリングします。
CREATE OR REPLACE TABLE T1 (id NUMBER, date TIMESTAMP_NTZ, name STRING) CLUSTER BY (id, date);
SHOW TABLES LIKE 'T1';
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
           created_on            | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes |    owner     | retention_time |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
 Tue, 21 Jun 2016 15:42:12 -0700 | T1   | TESTDB        | TESTSCHEMA  | TABLE |         | (ID,DATE)  | 0    | 0     | ACCOUNTADMIN | 1              |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
次のステートメントは、クラスタリングキーの順序を変更します。
ALTER TABLE t1 CLUSTER BY (date, id);
SHOW TABLES LIKE 'T1';
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
           created_on            | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes |    owner     | retention_time |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
 Tue, 21 Jun 2016 15:42:12 -0700 | T1   | TESTDB        | TESTSCHEMA  | TABLE |         | (DATE,ID)  | 0    | 0     | ACCOUNTADMIN | 1              |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
行アクセスポリシーの追加とドロップ¶
次の例では、単一の列を指定しながら、テーブルに行アクセスポリシーを追加します。ポリシーを設定した後、 Information Schema を確認することで検証できます。
ALTER TABLE t1 ADD ROW ACCESS POLICY rap_t1 ON (empl_id);
次の例では、1つのテーブルに2つの列を指定しながら、行アクセスポリシーを追加します。
ALTER TABLE t1 ADD ROW ACCESS POLICY rap_test2 ON (cost, item);
次の例では、テーブルから行アクセスポリシーをドロップします。Information Schema にクエリを実行して、ポリシーがドロップされたことを検証します。
ALTER TABLE t1 DROP ROW ACCESS POLICY rap_v1;
次の例は、テーブルの単一の SQL ステートメントで行アクセスポリシーの追加とドロップを組み合わせる方法を示しています。Information Schema を確認して結果を検証します。
alter table t1 drop row access policy rap_t1_version_1, add row access policy rap_t1_version_2 on (empl_id);
データメトリック関数の実行をスケジュールします¶
データメトリック関数のスケジュールを5分ごとに実行するように設定します。
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = '5 MINUTE';
データメトリック関数のスケジュールを毎日8:00 AM に実行するように設定します。
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * * UTC';
平日のみ8:00 AM にデータメトリック関数のスケジュールを実行するように設定します。
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * MON,TUE,WED,THU,FRI UTC';
1日3回、0600時、1200時、1800時(UTC)に実行するよう、データメトリック関数のスケジュールを設定します。
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'USING CRON 0 6,12,18 * * * UTC';
新しい行の挿入など、一般的な DML 操作でテーブルが変更されたときに実行されるデータメトリック関数を設定します。
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'TRIGGER_ON_CHANGES';
テーブルに結合ポリシーを適用します¶
テーブルを変更して、列の結合が許可された 結合ポリシー を適用します。
ALTER TABLE join_table_2
  SET JOIN POLICY jp1 ALLOWED JOIN KEYS (col1);
