CREATE TABLE¶
在当前/指定的架构中创建新表或替换现有表。一个表可以有多个列,每个列定义均涵盖名称、数据类型,以及列是否符合以下条件::
需要具有一个值 (NOT NULL)。
具有默认值。
具有任何引用完整性约束(主键、外键等)。
此外,该命令还支持以下变体:
CREATE TABLE ...AS SELECT(创建一个已填充的表;也称为 CTAS)
CREATE TABLE ...USING TEMPLATE(创建一个表,其中包含从一组暂存文件中派生的列定义)
CREATE TABLE ... LIKE(创建现有表的空副本)
CREATE TABLE ... CLONE(创建现有表的克隆)
语法¶
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>' , ... ] ) ]
其中:
inlineConstraint ::= [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY | [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } [ <constraint_properties> ]有关其他内联约束的详细信息,请参阅 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> ]有关其他行外约束的详细信息,请参阅 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> [ ... ]
掩码策略可以应用于 CTAS 语句中的列。先指定列数据类型,然后指定掩码策略。同样,可以将行访问策略应用于表。例如:
CREATE TABLE <table_name> ( <col1> <data_type> [ WITH ] MASKING POLICY <policy_name> [ , ... ] ) ... [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col1> [ , ... ] ) AS <query> [ ... ]
备注
在 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 GRANTS 的更多详细信息,请参阅本文档中的 COPY GRANTS。
CREATE TABLE ... LIKE¶
使用与现有表相同的列定义创建新表,但不从现有表中复制数据。列名称、类型、默认值和约束将复制到新表中:
CREATE [ OR REPLACE ] TABLE <table_name> LIKE <source_table> [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ] [ COPY GRANTS ] [ ... ]
有关 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 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
关键字创建的表相同。默认:无值。如果表未声明为
TEMPORARY
或TRANSIENT
,则该表为永久表。如果希望避免意外冲突,请避免以架构中已经存在的表命名临时表。
如果创建了一个与架构中另一个表同名的临时表,那么在该表上使用的所有查询和操作只影响会话中的临时表,直到删除临时表为止。如果删除该表,则删除临时表,而非架构中已存在的表。
有关临时表或瞬态表及其如何影响存储和费用的信息,请参阅以下资源:
READ ONLY
指定表为只读。READ ONLY 仅对正在使用 CREATE TABLE 命令的 CREATE TABLE ... CLONE 变体创建的临时表有效。
只读表不允许 DML 操作,只允许 DDL 操作的以下子集:
ALTER TABLE ... { ALTER | MODIFY } COLUMN ... { SET | UNSET } COMMENT
ALTER TABLE ... { ALTER | MODIFY } COLUMN ... { SET | UNSET } MASKING POLICY
ALTER TABLE ... { ALTER | MODIFY } COLUMN ... { SET | UNSET } TAG
ALTER TABLE ...RENAME COLUMN ...TO
ALTER TABLE ... RENAME TO
ALTER TABLE ... { SET | UNSET } COMMENT
ALTER TABLE ... { SET | UNSET } TAG
COMMENT
DESCRIBE
DROP
SHOW
UNDROP
只读表有一个
METADATA$ROW_POSITION
列。此元数据列为表中的每一行分配一个从 0 开始的连续行号。分配给每行的行号保持不变,直到删除该只读表。
TRANSIENT
指定表为瞬态。
与永久表一样,瞬态表在显式删除之前持续存在,并且对具有适当权限的任何用户均可见。但瞬态表的数据保护级别低于永久表,这意味着在系统发生故障时,瞬态表中的数据可能会丢失。因此,瞬态表只能用于可在 Snowflake 外部重新创建的数据。
默认:无值。如果表未声明为
TRANSIENT
或TEMPORARY
,则该表为永久表。CONSTRAINT ...
为表中的指定列定义内联或行外约束。
有关语法的详细信息,请参阅 CREATE | ALTER TABLE ... CONSTRAINT。有关约束条件的更多信息,请参阅 约束。
COLLATE 'collation_specification'
指定用于列操作(如字符串比较)的排序规则。此选项仅适用于文本列(VARCHAR、STRING、TEXT 等)。有关更多详细信息,请参阅 排序规则规范。
DEFAULT ...
或 .AUTOINCREMENT ...
指定在未通过 INSERT 或 CREATE TABLE AS SELECT 语句明确指定值的情况下,是否自动在列中插入默认值:
DEFAULT expr
使用指定的表达式定义列的默认值,该表达式可以是以下任意项:
{ 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,生成的值可能是
1
、3
、5
、7
、9
等。NOORDER 指定不保证值按递增顺序排列。
例如,如果序列中有 START 1 INCREMENT 2,生成的值可能是
1
、3
、101
、5
、103
等。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 , ... ] )
将表中的一个或多个列或列表达式指定为群集密钥。有关更多详细信息,请参阅 群集密钥和聚类表。
默认:无值(未为表定义群集密钥)
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_NAME
和PARSE_HEADER
一起使用时,必须将ERROR_ON_COLUMN_COUNT_MISMATCH
设置为 false。
DATA_RETENTION_TIME_IN_DAYS = integer
指定表的保留期,以便可以对表中的历史数据执行 Time Travel 操作(SELECT、CLONE、UNDROP)。有关更多详细信息,请参阅 了解和使用 Time Travel 和 使用临时表和瞬态表。
有关此对象级参数的详细说明以及有关对象参数的详细信息,请参阅 参数。
值:
Standard Edition:
0
或1
Enterprise Edition:
0
至90
用于永久表0
或1
临时表和瞬态表
默认:
Standard Edition:
1
Enterprise Edition(或更高版本):
1
(除非在架构、数据库或账户级别指定了不同的默认值)
备注
0
值实际上会为表禁用 Time Travel。MAX_DATA_EXTENSION_TIME_IN_DAYS = integer
对象参数,指定 Snowflake 可以延长表的数据保留期以防止表上的流过时的最大天数。
有关此参数的详细说明,请参阅 MAX_DATA_EXTENSION_TIME_IN_DAYS。
CHANGE_TRACKING = { TRUE | FALSE }
指定是否对表启用变更跟踪。
TRUE
在表上启用变更跟踪。此设置将一对隐藏列添加到源表中,并开始在列中存储变更跟踪元数据。这些列会占用少量存储空间。可以使用 SELECT 语句的 CHANGES 子句查询变更跟踪元数据,也可以通过在表上创建和查询一个或多个流来查询变更跟踪元数据。
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
指定要在表上设置的 聚合策略。
访问控制要求¶
权限 |
对象 |
备注 |
---|---|---|
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 权限。
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
使用说明¶
架构不能包含同名的表和/或视图。创建表时:
如果架构中已存在同名视图,则会返回错误,并且不会创建表。
如果架构中已存在同名的表,则会返回错误,并且不会创建表,除非命令中包含可选的
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_DATE、CURRENT_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 ...
也可使用以下语法显式指定名称:
CREATE TABLE <table_name> ( <col1_name> , <col2_name> , ... ) AS SELECT ...
指定的列名数必须与查询中的 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 | +--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
创建一个简单表,并为表本身和表中的列指定注释:
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 | +------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------+
通过在一个现有表中执行选择操作来创建表:
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 | +---+
以下为一个更高级的示例,通过在一个现有表中执行选择操作来创建表;在此示例中,新表中 summary_amount
列内的值派生自来源表中的两列:
CREATE TABLE testtable_summary (name, summary_amount) AS SELECT name, amount1 + amount2 FROM testtable;
通过从暂存的 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 | +-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
创建一个表,其列定义与另一个表相同,但没有任何行:
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 | |--------| +--------+
使用多列群集密钥来创建表:
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 | +---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+
为表中的列指定排序规则:
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');
创建一个表,其中列定义派生自一组包含 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' ) ));
请注意,按 order_id
对列排序仅适用于所有暂存文件共享一个架构的情况。如果暂存数据文件集包含具有共享列名的多个架构,则 order_id
列中表示的顺序可能与任何单个文件不匹配。
备注
如果返回的结果大于 16MB,使用 ARRAY_AGG(OBJECT_CONSTRUCT())
的 *
可能会导致错误。建议避免使用 *
导致较大的结果集,而仅将所需的列 COLUMN NAME
、TYPE
和 NULLABLE
用于查询。使用 WITHIN GROUP (ORDER BY order_id)
时可以包含可选列 ORDER_ID
。
创建在会话结束时自动删除的临时表:
CREATE TEMPORARY TABLE demo_temporary (i INTEGER); CREATE TEMP TABLE demo_temp (i INTEGER);
为了与其他供应商兼容,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);