ALTER TABLE

修改现有表的属性、列或约束条件。

另请参阅:

ALTER TABLE ...ALTER COLUMNCREATE TABLEDROP TABLESHOW TABLESDESCRIBE 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                             |
                                       }
                                       [ , ... ]
Copy

其中:

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

有关更改列的详细语法和示例,请参阅 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> [ , ... ] ]
Copy
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> ... ]
Copy
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> ... ]
  }
Copy
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> ]
Copy

有关创建/更改外联约束的详细语法和示例,请参阅 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> }
          [ , ... ]
     ]
  }
Copy

有关详细信息,请参阅 搜索优化操作 (searchOptimizationAction)

参数

name

要更改的表的标识符。如果标识符包含空格或特殊字符,则整个字符串必须放在双引号内。放在双引号内的标识符也区分大小写。

RENAME TO new_table_name

使用当前未被架构中的任何其他表使用的新标识符重命名指定的表。

有关表标识符的更多详细信息,请参阅 标识符要求

可以将对象移动到其他数据库和/或架构,同时选择重命名对象。为此,请指定一个限定 new_name 值,该值分别以 db_name.schema_name.object_nameschema_name.object_name 的形式包含新数据库和/或架构名称。

备注

  • 目标数据库和/或架构必须已存在。此外,新位置中不能存在同名对象;否则,该语句将返回错误。

  • 除非 对象所有者(即拥有对象 OWNERSHIP 权限的角色)也拥有目标架构,否则禁止将对象移动到托管访问架构。

重命名对象(表、列等)时,引用该对象的其他对象必须使用新名称进行更新。

SWAP WITH target_table_name

交换操作会在单个事务中重命名两个表。

请注意,不允许将永久表或瞬态表替换为临时表,临时表仅在创建该表的用户会话期间保留。此限制可防止在将临时表替换为永久表或瞬态表,并且现有永久表或瞬态表与临时表同名时,可能发生的命名冲突。要将永久表或临时表交换为临时表,请使用三个 ALTER TABLE ... RENAME TO 语句:将表 a 重命名为 c、将表 b 重命名为 a,以及将表 c 重命名为 b

备注

要重命名表或交换两个表,用于执行操作的角色必须对表具有 OWNERSHIP 权限。此外,重命名表需要对表的架构具有 CREATE TABLE 权限。

SET ...

指定要为表设置的一个或多个属性/参数(用空格、逗号或新行分隔):

DATA_RETENTION_TIME_IN_DAYS = integer

对象级参数,用于修改 Time Travel 表的保留期。有关更多信息,请参阅 了解和使用 Time Travel使用临时表和瞬态表

有关此参数的详细说明以及有关对象参数的更多信息,请参阅 参数

值:

  • Standard Edition:01

  • Enterprise Edition:

    • 090 用于永久表

    • 01 用于临时表和瞬态表

备注

0 值实际上会为表禁用 Time Travel。

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

对象参数,指定 Snowflake 可以延长表的数据保留期以防止表上的流过时的最大天数。

有关此参数的详细说明,请参阅 MAX_DATA_EXTENSION_TIME_IN_DAYS

CHANGE_TRACKING = TRUE | FALSE

指定对表启用或禁用变更跟踪。

  • TRUE 在表上启用变更跟踪。此选项将多个隐藏列添加到源表中,并开始在列中存储变更跟踪元数据。这些列会占用少量存储空间。

    可以使用 SELECT 语句的 CHANGES 子句查询变更跟踪元数据,也可以通过在表上创建和查询一个或多个流来查询变更跟踪元数据。

  • FALSE 在表上禁用变更跟踪。关联的隐藏列将从表中删除。

DEFAULT_DDL_COLLATION = 'collation_specification'

为添加到表中的任何新列指定默认 排序规则规范

设置该参数 不会 更改任何现有列的排序规则规范。

有关该参数的更多信息,请参阅 DEFAULT_DDL_COLLATION

ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE }

启用或禁用从源文件加载到表中的数据对表架构的自动更改,包括:

  • 已添加的列。

    默认情况下,架构演变限制为每次加载操作最多添加 100 列。要请求每个加载操作添加 100 个以上的列,请联系 `Snowflake 支持部门 `_。

  • 可以从新数据文件中缺少的任意数量的列中删除 NOT NULL 约束。

将其设置为 TRUE 可启用自动表模式演化。默认 FALSE 可禁用自动表模式演化。

备注

当满足以下所有条件时,从文件加载数据会演化表列:

  • COPY INTO <table> 语句包含 MATCH_BY_COLUMN_NAME 选项。

  • 用于加载数据的角色对表具有 EVOLVE SCHEMA 或 OWNERSHIP 权限。

此外,对于 CSV 的架构演化,当与 MATCH_BY_COLUMN_NAMEPARSE_HEADER 一起使用时,必须将 ERROR_ON_COLUMN_COUNT_MISMATCH 设置为 false。

CONTACT purpose = contact [ , purpose = contact ... ]

将现有对象与一个或多个 联系人 关联起来。

您不能在同一语句中使用其他属性设置 CONTACT 属性。

COMMENT = 'string_literal'

添加注释或覆盖表的现有注释。

备注

请勿使用 CREATE STAGE、ALTER STAGE、CREATE TABLE 或 ALTER TABLE 命令指定复制选项。建议您使用 COPY INTO <table> 命令指定复制选项。

UNSET ...

指定要为表取消设置的一个或多个属性/参数,这会将它们重置回默认值:

  • 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 , ... ] )

指定(或修改)一个或多个表列或列表达式作为表的群集密钥。这些是自动聚类维护聚类的列/表达式。

重要

群集密钥 并非 旨在或建议用于所有表;它们通常有利于非常大(即多 TB)的表。

在为表指定群集密钥之前,请参阅 了解 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' , ... ] ) ] [ , ...]

添加新列。您可以指定默认值、内联约束、排序规则规范、掩码策略和/或一个或多个标签。

要添加的列的默认值必须是字面量值;不能是表达式或函数返回的值。例如,以下命令会返回预期错误:

ALTER TABLE t1 ADD COLUMN c5 VARCHAR DEFAULT 12345::VARCHAR;
Copy
002263 (22000): SQL compilation error:
Invalid column default expression [CAST(12345 AS VARCHAR(134217728))]

首次创建表时,可以使用表达式作为默认值,但不能在添加列时使用。

列的默认值必须与该列的数据类型相匹配。尝试使用不匹配的数据类型设置默认值会失败并显示错误。例如:

ALTER TABLE t1 ADD COLUMN c6 DATE DEFAULT '20230101';
Copy
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 语法。

对于数据指标函数,使用以下值之一:51530607201440

'USING CRON expr time_zone'

指定用于定期运行数据指标函数的 cron 表达式和时区。支持标准 cron 实用程序语法的子集。

有关时区列表,请参阅 ` tz 数据库时区列表 <https://en.wikipedia.org/wiki/List_of_tz_database_time_zones (link removed)>`_。

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)
# | | | | |
# | | | | |
  * * * * *
Copy

支持以下特殊字符:

*

通配符。指定字段的任何出现。

L

代表“last”。在星期几字段中使用时,它允许您指定结构,例如给定月份的“最后一个星期五”(“5L”)。在日期字段中,它指定该月的最后一天。

/{n}

指示给定时间单位的第 n 个实例。每个时间量子都是独立计算的。例如,如果在月份字段中指定 4/3,则数据指标函数将安排在 4 月、7 月和 10 月执行(即从一年中的第 4 个月开始,每 3 个月一次)。在随后的几年中保持相同的计划。也就是说,数据指标函数 不会 安排在 1 月(10 月运行后 3 个月)运行。

备注

  • cron 表达式当前仅根据指定的时区进行计算。更改账户的 TIMEZONE 参数值(或在用户或会话级别设置该值):emph:不会 更改数据指标函数的时区。

  • cron 表达式定义数据指标函数的所有 有效 运行时间。Snowflake 尝试根据此计划运行数据指标函数;但是,如果在下一个有效运行时间开始之前未完成上一次运行,则跳过任何有效运行时间。

  • 当 cron 表达式中同时包含一个月中的特定日期和一周中的某一天时,数据指标函数将安排在满足一个月中某一天条件 一周中某一天条件的日期运行。例如,DATA_METRIC_SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC' 计划在每月的 10 号到 20 号以及这些日期之外的任何星期二或星期四的 0AM 运行数据指标函数。

  • cron 中最短的时间粒度为分钟。

    如果数据指标函数在其 cron 表达式中定义的分钟内恢复,则该数据指标函数的第一次计划运行就是 cron 表达式实例的下一次出现。例如,如果计划在每天午夜 (USING CRON 0 0 * * *) 运行的数据指标函数在午夜过后 5 秒 (00:00:05) 恢复,则第一次数据指标函数运行将在下一个午夜开始。

'TRIGGER_ON_CHANGES'

指定 DMF 在 DML 操作 修改表(例如插入新行或删除行)时运行。

您可以为以下对象指定 'TRIGGER_ON_CHANGES'

  • 动态表

  • 外部表

  • Apache Iceberg™ 表

  • 常规表

  • 临时表

  • 瞬态表

您不能为视图指定 'TRIGGER_ON_CHANGES'

重聚类,对表进行的更改不会触发 DMF 运行。

{ ADD | DROP } DATA METRIC FUNCTION metric_name

要添加到表或视图中或从表或视图中删除的数据指标函数的标识符。

ON ( col_name [ , ... ] [ , TABLE( table_name( col_name [ , ... ] ) ) ] )

要关联数据指标函数的表或视图列。列的数据类型必须与数据指标函数定义中指定的列的数据类型相匹配。

如果数据指标函数接受第二个表作为实参,请指定表及其列的完全限定名称。

EXPECTATION expectation_name ( expression ) [, expectation_name ( expression ) [ , ... ] ]

为列与 DMF 之间的关联定义一个或多个 期望值

[ , metric_name_2 ON ( col_name [ , ... ] [ , TABLE( table_name( col_name [ , ... ] ) ) ] ) ]

要添加到表或视图中的其他数据指标函数。使用逗号分隔每个数据指标函数及其指定列。

如果数据指标函数接受第二个表作为实参,请指定表及其列的完全限定名称。

EXECUTE AS ROLE role_name

指定 DMF 使用哪个角色运行。角色必须对表或视图拥有 SELECT 权限。

有关更多信息,请参阅 表或视图所需的权限

MODIFY DATA METRIC FUNCTION metric_name

要修改的数据指标函数的标识符。

ON ( col_name [ , ... ] [ , TABLE( table_name( col_name [ , ... ] ) ) ] )

指定与数据指标函数相关联的列。 如果数据指标函数接受第二个表作为实参,请指定表及其列的完全限定名称。

{ SUSPEND | RESUME }

在指定列上暂停或恢复数据指标函数。当为表或视图设置数据指标函数时,数据指标函数会自动包含在计划中。

  • SUSPEND 从计划中移除数据指标函数。

  • RESUME 将暂停的数据指标函数重新纳入计划。

{ ADD | MODIFY } EXPECTATION expectation_name ( expression ) [, expectation_name ( expression ) [ , ... ] ]

为列与 DMF 之间的关联定义或修改一个或多个 期望值

DROP EXPECTATION expectation_name [ , expectation_name [ , ... ] ]

从列与 DMF 之间的关联中移除指定的期望值。

[ , metric_name_2 ON ( col_name [ , ... ] [ , TABLE(col_name [ , ... ] ) ] ) ]

要修改的其他数据指标函数。使用逗号分隔每个数据指标函数及其指定列。如果数据指标函数接受第二个表作为实参,请指定表及其列的完全限定名称。

外部表列操作 (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> ...})标识。

例如,添加一个名为 mycol 的 VARCHAR,该列引用暂存 CSV 文件中的第一列:

mycol varchar as (value:c1::varchar)
Copy
半结构化数据:

将元素名称和值放在双引号内。使用点表示法遍历 VALUE 列中的路径。

例如,假设以下内容表示暂存文件中的单行半结构化数据:

{ "a":"1", "b": { "c":"2", "d":"3" } }
Copy

例如,添加一个名为 mycol 的 VARCHAR 列,该列引用暂存文件中的嵌套重复 c 元素:

mycol varchar as (value:"b"."c"::varchar)
Copy
METADATA$FILENAME:

一个伪列,标识外部表中包含的每个暂存数据文件的名称,包括其在暂存区中的路径。

RENAME COLUMN col_name to new_col_name

将指定列重命名为外部表中其他任何列当前未使用的新名称。

DROP COLUMN [ IF EXISTS ] col_name

从外部表中移除指定列。

如果不确定该列是否已存在,可以在删除该列时指定 IF EXISTS。如果该列不存在,则 DROP COLUMN 不起作用,也不会导致错误。

约束操作 (constraintAction)

ADD CONSTRAINT

向表中的一列或多列添加外联完整性约束。若要添加内联约束(对于列),请参阅 :ref:` 列操作 <label-alter_table_columnaction>`(本主题内容)。

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 [ , ... ])

向表中添加行访问策略。

必须至少指定一个列名称。可以使用逗号分隔每个列名称来指定其他列。使用此表达式可以向事件表和外部表添加行访问策略。

DROP ROW ACCESS POLICY policy_name

从表中删除行访问策略。

使用此子句将策略从表中删除。

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

在单个 SQL 语句中,删除在表上设置的行访问策略,并向同一个表添加行访问策略。

DROP ALL ROW ACCESS POLICIES

Drops all row access policy associations from the table.

在从事件表中删除策略 之前,从架构中删除行访问策略时,此表达式非常有用。使用此表达式从表中删除行访问策略关联。

假设在创建快照时对表应用了行访问策略,之后该策略被删除了。从 快照 恢复表后,除非运行带 DROP ALL ROW ACCESS POLICIES 子句的 ALTER TABLE 命令,否则无法对其进行查询。

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 语句中策略的 :doc:` 数据类型 </sql-reference-data-types>`(即 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>' ] )
Copy

其中:

  • search_method 指定下列方法之一,用于优化特定类型的谓词的查询:

    搜索方式

    描述

    FULL_TEXT

    使用 VARCHAR (text)、VARIANT、ARRAY 和 OBJECT 类型的谓词。

    EQUALITY

    等式和 IN 谓词。

    SUBSTRING

    匹配子字符串和正则表达式的谓词(例如 [ NOT ] LIKE[ NOT ] ILIKE[ NOT ] RLIKEREGEXP_LIKE)。

    GEO

    使用 GEOGRAPHY 类型的谓词。

  • target 指定列、VARIANT 字段或星号 (*)。

    根据 search_method 的值,可以指定以下类型之一的列或 VARIANT 字段:

    搜索方式

    支持的目标

    FULL_TEXT

    VARCHAR (text)、VARIANT、ARRAY 和 OBJECT 数据类型的列,包括 VARIANTs 中的字段的路径。

    EQUALITY

    数值、字符串、二进制和 VARIANT 数据类型的列,包括 VARIANTs 中的字段的路径。

    SUBSTRING

    字符串或 VARIANT 数据类型的列,包括 VARIANTs 中的字段的路径。指定字段的路径,如上文中 EQUALITY 所述;以相同的方式改进对嵌套字段的搜索。

    GEO

    GEOGRAPHY 数据类型的列。

    要指定 VARIANT 字段,请使用 :ref:` 点或括号表示法 <label-traversing_semistructured_data>`(例如 my_column:my_field_name.my_nested_field_namemy_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.csrc:a.b.c.d 等)。

    • 此配置不会影响不使用 src:a.b 前缀的查询(例如 src:asrc:z 等)。

    要将表中所有适用的列指定为目标,请使用星号 (*)。

    请注意,不能为给定的搜索方法 同时 指定星号和特定列名。但是,您可以在不同的搜索方法中指定星号。

    例如,您可以指定以下表达式:

    -- Allowed
    ON SUBSTRING(*)
    ON EQUALITY(*), SUBSTRING(*), GEO(*)
    
    Copy

    不能指定以下表达式:

    -- Not allowed
    ON EQUALITY(*, c1)
    ON EQUALITY(c1, *)
    ON EQUALITY(v1:path, *)
    ON EQUALITY(c1), EQUALITY(*)
    
    Copy
  • 如果 search_methodFULL_TEXT,则 ANALYZER => 'analyzer_name' 指定文本分析器的名称。

    当使用 FULL_TEXT 搜索方法并使用 SEARCHSEARCH_IP 函数执行查询时,分析器将搜索项(以及正在搜索的列中的文本)分解为词源元。如果从搜索字符串中提取的任何词元与从正在搜索的任何列或字段中提取的词元相匹配,则行匹配。当不使用 FULL_TEXT 搜索方法或不使用 SEARCH 或 SEARCH_IP 函数执行查询时,分析器不相关。

    分析器对字符串进行标记化处理时,会在发现特定分隔符的地方将其打断。这些定界符不包括在结果词元中,不会提取空词元。

    该参数可接受以下值:

    • DEFAULT_ANALYZER:根据以下分隔符将文本分解为词元:

      字符

      Unicode 代码

      描述

      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 分析器则不这样做。请参阅 使用分析器来调整搜索行为

      有关 Unicode Text Segmentation 算法的更多信息,请参阅 https://unicode.org/reports/tr29/ (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);
Copy

如果您在同一事件表上多次运行 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);
Copy

这会将 c1、c2、c3 和 c4 列的相等谓词添加到表的配置中。这相当于运行以下命令:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2, c3, c4);
Copy

有关示例,请参阅 为特定列启用搜索优化

DROP SEARCH OPTIMIZATION

移除整个表的 搜索优化,或者如果指定了可选 ON 子句,则从特定列中移除。

备注

  • 如果表具有搜索优化属性,则删除该表并取消删除它将保留搜索优化属性。

  • 从表中移除搜索优化属性然后重新添加它时,会产生与首次添加搜索优化属性时相同的成本。

ON search_method_with_target | column_name | expression_id [ , ... ]

指定要删除特定列或 VARIANT 字段的搜索优化配置(而不是删除整个表的搜索优化)。

若要标识要删除的列配置,请指定以下配置之一:

  • 对于 search_method_with_target,指定一种方法,用于优化一个或多个特定目标(可以是列或 VARIANT 字段)的查询。使用 前面描述的语法

  • 对于 column_name,指定为搜索优化配置的列的名称。指定列名称将删除该列的所有表达式,包括使用列中 VARIANT 字段的表达式。

  • 对于 expression_id,指定 DESCRIBE SEARCH OPTIMIZATION 命令的输出中列出的表达式 ID。

若要指定其中的多个项,请在项之间使用逗号分隔。

可以指定具有目标、列名和表达式 IDs 的搜索方法的任意组合。

有关示例,请参阅 删除特定列的搜索优化

使用说明:通用

  • 对表的更改不会自动传播到在该表上创建的视图。例如,如果移除表中的一列,并且将视图定义为包含该列,则该视图将失效;视图不会调整以移除列。

  • 删除列不会立即释放该列的存储空间。

    • 在该微分区被重新写入之前,每个微分区中的空间不会被回收。对该微分区中的 1 行或多行执行写入操作(插入、更新、删除等)会导致微分区被重新写入。如果您要强制收回空间,可以按照以下步骤操作:

      1. 使用 CREATE TABLE AS SELECT (CTAS) 语句创建一个新表,该表仅包含要保留的旧表的列。

      2. DATA_RETENTION_TIME_IN_DAYS 参数设置为旧表的 :code:`0`(可选)。

      3. 删除旧表。

    • 如果表受 Time Travel 功能保护,则在 Time Travel 保留期到期之前,不会回收 Time Travel 存储使用的空间。

  • 如果在包含现有行的表中添加了带默认值的新列,则所有现有行都将使用默认值填充。

  • 目前不支持添加具有包含函数默认值的新列。返回以下错误:

    Invalid column default expression (expr)

  • 要更改表,您必须使用具有该表的所有权权限的角色。

  • 若要为表添加聚类,还必须具备包含该表的架构和数据库的 USAGE 或 OWNERSHIP 权限。

  • 对于掩码策略:

    • USING 子句和 FORCE 关键字都是可选的;对列设置掩码策略时,两者都不是必需的。USING 子句和 FORCE 关键字可以单独使用,也可以一起使用。有关详细信息,请参阅:

    • 可以使用条件列的单个掩码策略应用于多个表,前提是表的列结构与策略中指定的列匹配。

    • 修改具有掩码策略的一个或多个表列,或修改具有行访问策略的表时,请使用 POLICY_CONTEXT 函数模拟对受掩码策略保护的列以及受行访问策略保护的表的查询。

  • 使用行访问策略:

    • Snowflake 支持在单个 SQL 语句中添加和删除行访问策略。

      例如,若要将已在表上设置的行访问策略替换为其他策略,请先删除行访问策略,然后再添加新的行访问策略。

    • 对于给定资源(即表或视图),要 ADDDROP 行访问策略,必须具有架构的 APPLY ROW ACCESS POLICY 权限,或者 资源的 OWNERSHIP 权限,以及行访问策略资源的 APPLY 权限。

    • 一个表或视图一次只能由一个行访问策略保护。如果策略正文引用受行访问策略保护的表或视图列或受掩码策略保护的列,则添加策略将失败。

      同样,如果掩码策略正文引用受行访问策略或其他掩码策略保护的表,则向表列添加掩码策略将失败。

    • 行访问策略不能应用于系统视图或表函数。

    • 与其他 DROP <object> 操作类似,如果尝试从未添加行访问策略的资源中删除行访问策略,则 Snowflake 会返回错误。

    • 如果对象同时具有行访问策略和一个或多个掩码策略,则首先评估行访问策略。

  • 如果创建外键,则 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) ...
    
    Copy

    在这两种情况下,列的顺序均为 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 会使用顺序位置。如果在向表或视图中添加数据指标函数后重命名列,则数据指标函数与列的关联仍然有效。

  • 同类数据指标函数中只能添加一个列中。例如,不能两次将 NULL_COUNT 数据指标函数添加到单个列。

  • 如果您在添加引用某列的数据指标函数后删除该列,Snowflake 将无法评估该数据指标函数。

  • 不支持引用虚拟列。

计划 DMF

设置完计划后,计划需要十分钟才能生效。

同样,取消设置 DMF 后,计划更改需要十分钟才能生效。有关更多信息,请参阅 计划 DMF 运行

示例

以下各节提供了使用 ALTER COLUMN 命令的示例:

重命名表

下面创建一个名为 t1 的表:

CREATE OR REPLACE TABLE t1(a1 number);
Copy
SHOW TABLES LIKE 't1';
Copy
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| 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;
Copy
SHOW TABLES LIKE 'tt1';
Copy
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| 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   |
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+

交换表

以下语句创建名为 t1t2 的表:

CREATE OR REPLACE TABLE t1(a1 NUMBER, a2 VARCHAR, a3 DATE);
CREATE OR REPLACE TABLE t2(b1 VARCHAR);
Copy
DESC TABLE t1;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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;
Copy
DESC TABLE t1;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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);
Copy
DESC TABLE t1;
Copy
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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;
Copy

以下语句添加一个名为 a3 且带有 NOT NULL 约束的列:

ALTER TABLE t1 ADD COLUMN a3 NUMBER NOT NULL;
Copy

以下语句添加一个名为 a4 且带有默认值和 NOT NULL 约束的列:

ALTER TABLE t1 ADD COLUMN a4 NUMBER DEFAULT 0 NOT NULL;
Copy

以下语句添加以特定语言的 排序规则规范 命名的名为 a5 的 VARCHAR 列:

ALTER TABLE t1 ADD COLUMN a5 VARCHAR COLLATE 'en_US';
Copy
DESC TABLE t1;
Copy
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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;
Copy

DESCRIBE TABLE 命令的输出如下所示,上面的语句对名为 a2 的现有列没有影响:

DESC TABLE t1;
Copy
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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;
Copy
DESC TABLE t1;
Copy
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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;
Copy
DESC TABLE t1;
Copy
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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;
Copy

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        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
Copy

在外部表中添加、重命名和弃用列

以下语句创建一个名为 exttable1 的外部表:

CREATE EXTERNAL TABLE exttable1
  LOCATION=@mystage/logs/
  AUTO_REFRESH = true
  FILE_FORMAT = (TYPE = PARQUET)
  ;
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| 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);
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| 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;
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| 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;
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| 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);
Copy
SHOW TABLES LIKE 'T1';
Copy
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
           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);
Copy
SHOW TABLES LIKE 'T1';
Copy
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
           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);
Copy

下面的示例在单个表中指定两列时添加行访问策略。

ALTER TABLE t1 ADD ROW ACCESS POLICY rap_test2 ON (cost, item);
Copy

以下示例从表中删除行访问策略。通过查询 Information Schema 来验证策略是否已删除。

ALTER TABLE t1 DROP ROW ACCESS POLICY rap_v1;
Copy

以下示例演示如何在表的单个 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);
Copy

安排运行数据指标函数的时间

将数据指标函数计划设置为每 5 分钟运行一次:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = '5 MINUTE';
Copy

将数据指标函数计划设置为每天 8:00 AM 运行:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * * UTC';
Copy

将数据指标函数计划设置为仅在工作日的 8:00 AM 运行:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * MON,TUE,WED,THU,FRI UTC';
Copy

将数据指标函数计划设置为每天在 0600、1200 和 1800 UTC 时间运行三次:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 6,12,18 * * * UTC';
Copy

将数据指标函数设置为在常规 DML 操作(例如插入新行)修改表时运行:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'TRIGGER_ON_CHANGES';
Copy

在表上应用联接策略

更改表以应用 联接策略,具有允许的联接列:

ALTER TABLE join_table_2
  SET JOIN POLICY jp1 ALLOWED JOIN KEYS (col1);
Copy
语言: 中文