CREATE TABLE

在当前/指定的架构中创建新表或替换现有表。一个表可以有多个列,每个列定义均涵盖名称、数据类型,以及列是否符合以下条件::

  • 需要具有一个值 (NOT NULL)。

  • 具有默认值。

  • 具有任何引用完整性约束(主键、外键等)。

此外,该命令还支持以下变体:

  • CREATE TABLE ...AS SELECT(创建一个已填充的表;也称为 CTAS)

  • CREATE TABLE ...USING TEMPLATE(创建一个表,其中包含从一组暂存文件中派生的列定义)

  • CREATE TABLE ... LIKE(创建现有表的空副本)

  • CREATE TABLE ... CLONE(创建现有表的克隆)

另请参阅:

ALTER TABLEDROP TABLESHOW TABLESDESCRIBE TABLE

语法

CREATE [ OR REPLACE ]
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | VOLATILE | TRANSIENT } ]
  TABLE [ IF NOT EXISTS ] <table_name> (
    -- Column definition
    <col_name> <col_type>
      [ inlineConstraint ]
      [ NOT NULL ]
      [ COLLATE '<collation_specification>' ]
      [
        {
          DEFAULT <expr>
          | { AUTOINCREMENT | IDENTITY }
            [
              {
                ( <start_num> , <step_num> )
                | START <num> INCREMENT <num>
              }
            ]
            [ { ORDER | NOORDER } ]
        }
      ]
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ [ WITH ] PROJECTION POLICY <policy_name> ]
      [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
      [ COMMENT '<string_literal>' ]

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

    -- Out-of-line constraints
    [ , outoflineConstraint [ ... ] ]
  )
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] AGGREGATION POLICY <policy_name> ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
Copy

其中:

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

有关其他内联约束的详细信息,请参阅 CREATE | ALTER TABLE ... CONSTRAINT

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

有关其他行外约束的详细信息,请参阅 CREATE | ALTER TABLE ... CONSTRAINT

备注

不要使用 CREATE STAGE、ALTER STAGE、CREATE TABLE 或 ALTER TABLE 命令指定文件格式选项或复制选项。建议您使用 COPY INTO <table> 命令指定文件格式选项或复制选项。

变体语法

CREATE TABLE ...AS SELECT(也称为 CTAS)

创建一个新表,其中填充了查询返回的数据:

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

掩码策略可以应用于 CTAS 语句中的列。先指定列数据类型,然后指定掩码策略。同样,可以将行访问策略应用于表。例如:

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

备注

在 CTAS 中,COPY GRANTS 子句仅在与 OR REPLACE 子句组合时才有效。COPY GRANTS 从要使用 CREATE OR REPLACE 替换的表(如已存在)中复制权限,而非从 SELECT 语句中查询的源表中复制权限。使用 COPY GRANTS 的 CTAS 允许您使用一组新数据覆盖表,同时将现有授权保留在该表上。

有关 COPY GRANTS 的更多详细信息,请参阅本文档中的 COPY GRANTS

CREATE TABLE ...USING TEMPLATE

使用 INFER_SCHEMA 函数创建一个新表,其中包含从一组暂存文件派生的列定义。此功能支持 Apache Parquet、Apache Avro、ORC、JSON 和 CSV 文件。

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

备注

如果语句要替换同名的现有表,则从要替换的表中复制授权。如果没有该名称的现有表,则从要克隆的源表中复制授权。

有关 COPY GRANTS 的更多详细信息,请参阅本文档中的 COPY GRANTS

CREATE TABLE ... LIKE

使用与现有表相同的列定义创建新表,但不从现有表中复制数据。列名称、类型、默认值和约束将复制到新表中:

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

有关 COPY GRANTS 的更多详细信息,请参阅本文档中的 COPY GRANTS

备注

当前 支持具有通过数据共享访问的自动递增序列的表的 CREATE TABLE ... LIKE。

CREATE TABLE ... CLONE

创建具有相同的列定义的新表,并包含源表中的全部现有数据,而不会实际复制数据。此变体还可用于克隆过去特定时间/点的表(使用 Time Travel):

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

备注

如果语句要替换同名的现有表,则从要替换的表中复制授权。如果没有该名称的现有表,则从要克隆的源表中复制授权。

有关 COPY GRANTS 的更多详细信息,请参阅本文档中的 COPY GRANTS

有关克隆的更多详细信息,请参阅 CREATE <object> ... CLONE

必填参数

name

指定表的标识符(即名称);对于在其中创建表的架构必须唯一。

此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,"My object")。放在双引号内的标识符也区分大小写。

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

col_name

指定列标识符(即名称)。表标识符的所有要求也适用于列标识符。

有关更多详细信息,请参阅 标识符要求保留和受限关键字

备注

除了标准的保留关键字之外,以下关键字不能用作列标识符,因为它们是为 ANSI 标准上下文函数保留的:

  • CURRENT_DATE

  • CURRENT_ROLE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • CURRENT_USER

有关保留关键字的列表,请参阅 保留和受限关键字

col_type

指定列的数据类型。

有关可为表列指定的数据类型的详细信息,请参阅 SQL 数据类型参考

query

对于 CTAS 和 USING TEMPLATE 是必需的。

  • 对于 CTAS,指定填充表的 SELECT 语句

  • 对于 CREATE TABLE ...USING TEMPLATE,指定调用 INFER_SCHEMA 函数并将输出格式化为数组的子查询。或者,USING TEMPLATE 接受字符串字面量或变量形式的 INFER_SCHEMA 输出。

source_table

对于 LIKE 和 CLONE 是必需的。

  • 对于 CREATE TABLE ...LIKE,指定从中复制属性和列定义的表。

  • 对于 CREATE TABLE ...CLONE,指定用作克隆源的表。

可选参数

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

指定该表仅在创建该视图的 :doc:` 会话 </user-guide/session-policies>` 期间持续存在。临时表及其所有内容将在会话结束时删除。

提供 TEMPORARY (例如 GLOBAL TEMPORARY)的同义词和缩写是为了与其他数据库兼容(例如,防止在迁移 CREATE TABLE 语句时出错)。使用其中任何一个关键字创建的表的显示和行为均与使用 TEMPORARY 关键字创建的表相同。

默认:无值。如果表未声明为 TEMPORARYTRANSIENT,则该表为永久表。

如果希望避免意外冲突,请避免以架构中已经存在的表命名临时表。

如果创建了一个与架构中另一个表同名的临时表,那么在该表上使用的所有查询和操作只影响会话中的临时表,直到删除临时表为止。如果删除该表,则删除临时表,而非架构中已存在的表。

有关临时表或瞬态表及其如何影响存储和费用的信息,请参阅以下资源:

READ ONLY

指定表为只读。READ ONLY 仅对正在使用 CREATE TABLE 命令的 CREATE TABLE ... CLONE 变体创建的临时表有效。

只读表不允许 DML 操作,只允许 DDL 操作的以下子集:

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

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

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

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

  • ALTER TABLE ... RENAME TO

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

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

  • COMMENT

  • DESCRIBE

  • DROP

  • SHOW

  • UNDROP

只读表有一个 METADATA$ROW_POSITION 列。此元数据列为表中的每一行分配一个从 0 开始的连续行号。分配给每行的行号保持不变,直到删除该只读表。

TRANSIENT

指定表为瞬态。

与永久表一样,瞬态表在显式删除之前持续存在,并且对具有适当权限的任何用户均可见。但瞬态表的数据保护级别低于永久表,这意味着在系统发生故障时,瞬态表中的数据可能会丢失。因此,瞬态表只能用于可在 Snowflake 外部重新创建的数据。

默认:无值。如果表未声明为 TRANSIENTTEMPORARY,则该表为永久表。

备注

瞬态表有一些存储方面的注意事项。

有关在决定创建临时表或瞬态表时的这些注意事项及其他注意事项的更多信息,请参阅 使用临时表和瞬态表Time Travel 和故障安全的存储成本

CONSTRAINT ...

为表中的指定列定义内联或行外约束。

有关语法的详细信息,请参阅 CREATE | ALTER TABLE ... CONSTRAINT。有关约束条件的更多信息,请参阅 约束

COLLATE 'collation_specification'

指定用于列操作(如字符串比较)的排序规则。此选项仅适用于文本列(VARCHAR、STRING、TEXT 等)。有关更多详细信息,请参阅 排序规则规范

DEFAULT ... . AUTOINCREMENT ...

指定在未通过 INSERT 或 CREATE TABLE AS SELECT 语句明确指定值的情况下,是否自动在列中插入默认值:

DEFAULT expr

使用指定的表达式定义列的默认值,该表达式可以是以下任意项:

  • 常量值。

  • 序列参考 (seq_name.NEXTVAL)。

  • 返回标量值的简单表达式。

    如果 UDF 不是 安全 UDF,简单表达式可能包括 SQL UDF(用户定义函数)。

    备注

    如果默认表达式引用 SQL UDF,则在创建表时将函数替换为其定义。如果在将来重新定义用户定义函数,则不会更新列的默认表达式。

    简单表达式 不能 包含对以下内容的引用:

    • 子查询。

    • 汇总。

    • 窗口函数。

    • 安全 UDFs。

    • 用 SQL 以外的语言编写的 UDFs(例如 Java、JavaScript)。

    • 外部函数。

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

指定 AUTOINCREMENT 或 IDENTITY 时,列的默认值以指定数字开头,并且每个连续值都会自动按指定的量递增。

AUTOINCREMENT 和 IDENTITY 为同义,只能用于具有数值数据类型的列,例如 NUMBER、INT、FLOAT。

小心

Snowflake 使用序列来生成自动递增列的值。序列存在局限性;请参阅 序列语义

起始值和步进/增量值默认均为 1

备注

手动将值插入 AUTOINCREMENT 或 IDENTITY 列会导致值重复。如果您手动将值 5 插入 AUTOINCREMENT 或 IDENTITY 列,则后续插入的行可能会使用与列的默认值相同的值 5

使用 ORDER 或 NOORDER 指定是按 升序还是降序 为自动递增的列生成值。

  • ORDER 指定了为序列或自动递增列生成的值按升序排列(如果间隔为负值,则按降序排列)。

    例如,如果序列或自动递增的列具有 START 1 INCREMENT 2,生成的值可能是 13579 等。

  • NOORDER 指定不保证值按递增顺序排列。

    例如,如果序列中有 START 1 INCREMENT 2,生成的值可能是 131015103 等。

    NOORDER 可以在需要同时执行多个插入操作时提高性能(例如,在多个客户端执行多个 INSERT 语句时)。

如果未指定 ORDER 或 NOORDER,NOORDER_SEQUENCE_AS_DEFAULT 参数将决定设置哪个属性。

备注

DEFAULT 和 AUTOINCREMENT 是互斥的;只能为一列指定一个值。

MASKING POLICY = policy_name

指定要在列上设置的 掩码策略

PROJECTION POLICY policy_name

指定要在列上设置的 投影策略

COMMENT 'string_literal'

指定列的注释。

(请注意,可以在列级别或表级别指定注释。相应的语法略有不同。

USING ( col_name , cond_col_1 ... )

指定要传递到条件掩码策略 SQL 表达式的实参。

列表中的第一列指定用于掩码处理或标记数据的策略条件的列,并且 必须 与设置掩码策略的列匹配。

附加列指定要评估的列,以确定在对第一列进行查询时是否对查询结果的每行中的数据进行掩码处理或标记化。

如果省略 USING 子句,Snowflake 会将条件掩码策略视为正常的 掩码策略

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

将表中的一个或多个列或列表达式指定为群集密钥。有关更多详细信息,请参阅 群集密钥和聚类表

默认:无值(未为表定义群集密钥)

重要

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

在为表指定群集密钥之前,应当对微分区有所了解。有关更多信息,请参阅 了解 Snowflake 表结构

ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE }

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

  • 已添加的列。

    默认情况下,架构演变限制为每次加载操作最多添加 10 列。要请求每个加载操作添加 10 个以上的列,请联系 ` 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。

DATA_RETENTION_TIME_IN_DAYS = integer

指定表的保留期,以便可以对表中的历史数据执行 Time Travel 操作(SELECT、CLONE、UNDROP)。有关更多详细信息,请参阅 了解和使用 Time Travel使用临时表和瞬态表

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

值:

  • Standard Edition:01

  • Enterprise Edition:

    • 090 用于永久表

    • 01 临时表和瞬态表

默认:

  • Standard Edition:1

  • Enterprise Edition(或更高版本): 1 (除非在架构、数据库或账户级别指定了不同的默认值)

备注

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

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

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

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

CHANGE_TRACKING = { TRUE | FALSE }

指定是否对表启用变更跟踪。

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

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

  • FALSE 不在表上启用变更跟踪。

默认:FALSE

DEFAULT_DDL_COLLATION = 'collation_specification'

为表中的列指定默认 排序规则规范,包括将来添加到表中的列。

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

COPY GRANTS

指定在使用以下 CREATE TABLE 变体创建新表时保留原始表的访问权限:

  • CREATE OR REPLACE TABLE

  • CREATE TABLE ... LIKE

  • CREATE TABLE ... CLONE

该参数将 OWNERSHIP 之外的所有权限从现有表复制到新表。新表 不会 继承为架构中的对象类型定义的任何未来授权。默认情况下,执行 CREATE TABLE 语句的角色拥有新表。

如果该参数未包含在 CREATE TABLE 语句中,则新表 不会 继承在原始表上授予的任何显式访问权限,但会继承为架构中的对象类型定义的任何未来授权。

注意:

  • 借助 数据共享

    • 如果现有表已共享到另一个账户,则替换表也会共享。

    • 如果现有表已作为数据使用者与您的账户共享,并且进一步授予了对账户中其他角色的访问权限(在父数据库上使用 GRANT IMPORTED PRIVILEGES),则还会授予对替换表的访问权限。

  • 替换表的 SHOW GRANTS 输出会将复制权限的获得者列为执行 CREATE TABLE 语句的角色,并附带执行语句时的当前时间戳。

  • 复制授权的操作在 CREATE TABLE 命令中会以原子方式发生(即在同一事务中)。

COMMENT = 'string_literal'

指定表的注释。

默认:无值

(请注意,可以在列级别或表级别指定注释。相应的语法略有不同。

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

指定要在表上设置的 行访问策略

AGGREGATION POLICY policy_name

指定要在表上设置的 聚合策略

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

指定 标签 名称和标签字符串值。

标签值始终为字符串,标签值的最大字符数为 256。

有关在语句中指定标签的信息,请参阅 对象和列的标签配额

访问控制要求

用于执行此 SQL 命令的 角色 必须至少具有以下 权限

权限

对象

备注

CREATE TABLE

架构

请注意,创建临时表 需要 CREATE TABLE 权限。

SELECT

表、外部表、视图

仅在克隆表或执行 CTAS 语句时,对于查询的表和/或视图是必需的。

APPLY

掩码策略、行访问策略、标签

仅在创建表时应用掩码策略、行访问策略、对象标签或这些 :doc:` 治理 </guides-overview-govern>` 功能的任何组合时才需要。

USAGE(外部暂存区)或 READ(内部暂存区)

暂存区

在使用以下语句从暂存文件派生表列定义时需要:CREATE TABLE ...USING TEMPLATE 语句。

OWNERSHIP

若要创建创建与架构中已存在的对象同名的临时对象,必须授予角色或使其继承对象上的 OWNERSHIP 权限。

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

请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述

使用说明

  • 架构不能包含同名的表和/或视图。创建表时:

    • 如果架构中已存在同名视图,则会返回错误,并且不会创建表。

    • 如果架构中已存在同名的表,则会返回错误,并且不会创建表,除非命令中包含可选的 OR REPLACE 关键字。

      重要

      使用 OR REPLACE 等效于对现有表使用 DROP TABLE,然后创建一个同名的新表;但是,被弃用的表 不会 从系统中永久移除。相反,它保留在 Time Travel 中。请务必注意,因为 Time Travel 中丢弃的表可以恢复,但它们也有助于您账户的数据存储。有关更多信息,请参阅 Time Travel 和故障安全的存储成本

      CREATE OR REPLACE <object> 语句是原子的。也就是说,当对象被替换时,旧对象将被删除,新对象将在单个事务中创建。

      这意味着与 CREATE OR REPLACE TABLE 操作并行的任何查询都使用旧的或新的表版本。

      重新创建表或交换表会删除其更改数据。表上的任何流都会变为 过时。此外,将此表作为基础表的视图上的任何流都会变为过时。过时的流是不可读的。

  • 与 :doc:` 保留关键字 </sql-reference/reserved-keywords>` 类似,ANSI 保留函数名称(CURRENT_DATECURRENT_TIMESTAMP 等)不能用作列名。

  • CREATE TABLE ... CLONE:

    如果源表具有群集密钥,则新表具有群集密钥。默认情况下,即使来源表的自动聚类未暂停,新表的自动群集也会暂停。

  • CREATE TABLE ... CHANGE_TRACKING = TRUE:

    启用变更跟踪后,表将在操作期间锁定。锁定可能会导致某些关联的 DDL/DML 操作出现延迟。有关更多信息,请参阅 资源锁定

  • CREATE TABLE ... LIKE:

    如果源表具有群集密钥,则新表具有群集密钥。默认情况下,即使来源表的自动聚类已暂停,新表的自动聚类也不会暂停。

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

    • 如果在 SELECT 列表中,列名的别名是有效列,则 CTAS 语句中不需要提供列定义;如果省略,则从基础查询推断列名和类型:

      CREATE TABLE <table_name> AS SELECT ...
      
      Copy

      也可使用以下语法显式指定名称:

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

      指定的列名数必须与查询中的 SELECT 列表项数匹配;列的类型根据查询生成的类型推断。

    • 在 CTAS 语句中指定群集密钥时:

      • 列定义是必需的,必须在语句中明确指定。

      • 默认情况下,即使来源表的自动聚类已暂停,新表的自动聚类也不会暂停。

    • 如果希望使用特定顺序的行创建表,请在 CTAS 的 SELECT 子句中使用 ORDER BY 分子句。指定 CLUSTER BY 不会在创建表时对数据进行聚类; CLUSTER BY 会依赖于 自动聚类 来随着时间的推移重聚类数据。

      CREATE TABLE 语句中的 ORDER BY 分子句不会影响将来的 SELECT 语句返回该表的行顺序。若要指定将来 SELECT 语句中的行顺序,请在这些语句中使用 ORDER BY 分子句。

  • 在事务中,任何 DDL 语句(包括 CREATE TEMPORARY/TRANSIENT TABLE)都会在执行 DDL 语句本身之前提交事务。然后,DDL 语句在其自己的事务中运行。DDL 语句之后的下一个语句会启动一个新事务。因此不能在单个事务中创建、使用和删除临时表或瞬态表。如果要在事务中使用临时表或瞬态表,请在事务之前创建该表,并在事务之后删除该表。

  • 重新创建表(使用可选 OR REPLACE 关键字)会删除其历史记录,这会使表上的任何流都过时。过时的流是不可读的。

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

  • 在一个或多个表列上使用掩码策略创建表或将行访问策略添加到表时,请使用 POLICY_CONTEXT 函数模拟对受掩码策略保护的列和受行访问策略保护的表的查询。

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段

示例

在当前数据库中创建一个简单表,并在该表中插入一行:

CREATE TABLE mytable (amount NUMBER);

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

INSERT INTO mytable VALUES(1);

SHOW TABLES like 'mytable';

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

DESC TABLE mytable;

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

创建一个简单表,并为表本身和表中的列指定注释:

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

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

SHOW TABLES LIKE 'example';

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

DESC TABLE example;

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

通过在一个现有表中执行选择操作来创建表:

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

DESC TABLE mytable_copy;

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

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

DESC TABLE mytable_copy2;

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

SELECT * FROM mytable_copy2;

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

以下为一个更高级的示例,通过在一个现有表中执行选择操作来创建表;在此示例中,新表中 summary_amount 列内的值派生自来源表中的两列:

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

通过从暂存的 Parquet 数据文件中选择列来创建表:

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

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

DESC TABLE parquet_col;

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

创建一个表,其列定义与另一个表相同,但没有任何行:

CREATE TABLE mytable (amount NUMBER);

INSERT INTO mytable VALUES(1);

SELECT * FROM mytable;

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

CREATE TABLE mytable_2 LIKE mytable;

DESC TABLE mytable_2;

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

SELECT * FROM mytable_2;

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

使用多列群集密钥来创建表:

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

SHOW TABLES LIKE 'mytable';

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

为表中的列指定排序规则:

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

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

创建一个表,其中列定义派生自一组包含 Avro、Parquet 或 ORC 数据的暂存文件。

请注意,语句中引用的 mystage 暂存区和 my_parquet_format 文件格式必须已存在。一组文件必须已暂存在暂存区定义中引用的云存储位置中。

下面的示例使用从暂存文件中检测到的架构创建一个表,并按 order_id 对列进行排序。它基于 INFER_SCHEMA 主题中的示例构建。

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

请注意,按 order_id 对列排序仅适用于所有暂存文件共享一个架构的情况。如果暂存数据文件集包含具有共享列名的多个架构,则 order_id 列中表示的顺序可能与任何单个文件不匹配。

备注

如果返回的结果大于 16MB,使用 ARRAY_AGG(OBJECT_CONSTRUCT())* 可能会导致错误。建议避免使用 * 导致较大的结果集,而仅将所需的列 COLUMN NAMETYPENULLABLE 用于查询。使用 WITHIN GROUP (ORDER BY order_id) 时可以包含可选列 ORDER_ID

创建在会话结束时自动删除的临时表:

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

为了与其他供应商兼容,Snowflake 还支持使用以下关键字作为 TEMPORARY 的同义词:

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

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

CREATE VOLATILE TABLE demo_volatile (i INTEGER);
Copy
语言: 中文