CREATE TEMPORARY TABLE

创建数据仅存在于当前会话中的表。默认情况下,临时表数据对其他会话不可见。

语法

使用列定义创建:

CREATE [ scope ] TEMP[ORARY] TABLE [ IF NOT EXISTS ] [[database.]schema.]table-name 
   ( column-definition[,...] )
   [ table-constraint ]
   [ ON COMMIT { DELETE | PRESERVE } ROWS ]
   [ NO PROJECTION ]
   [ ORDER BY table-column[,...] ]
   [ segmentation-spec ]
   [ KSAFE [safety-level] ]
   [ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
   [ DISK_QUOTA quota ]

从其他表创建:


CREATE TEMP[ORARY] TABLE [ IF NOT EXISTS ] [[database.]schema.]table-name
   [ ( column-name-list ) ]
   [ ON COMMIT { DELETE | PRESERVE } ROWS ]
   AS  [ /*+ LABEL */ ] [ AT {{< codevar >}}epoch{{< /codevar >}} ] query [ ENCODED BY column-ref-list ]
   [ DISK_QUOTA quota ]

参数

scope
表定义的可见性:
  • GLOBAL:表定义对所有会话可见,并且持续存在,直到显式删除了该表。

  • LOCAL:表定义仅对在其中创建该表定义的会话可见,并在会话结束后删除。

如果未指定范围,Vertica 将使用通过 DefaultTempTableLocal 配置参数设置的默认值。

不论此设置如何,都可通过 ON COMMIT DELETE 和 ON COMMIT PRESERVE 关键字(见下文)设置临时表数据的保留策略。

有关详细信息,请参阅创建临时表

IF NOT EXISTS

如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。

IF NOT EXISTS 子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。

请参阅 ON_ERROR_STOP 了解相关信息。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

如果未指定架构,系统将在默认架构中创建表。

table-name
要创建的表的名称,其中 table-name 符合标识符中描述的约定。 同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
column-definition
列名称和类型。一个表最多可以有 9800 列。
table-constraint
为表元数据添加约束。
ON COMMIT
数据为事务范围还是会话范围数据:
ON COMMIT {PRESERVE | DELETE} ROWS
  • DELETE(默认)会将临时表标记为事务范围数据。每次提交之后,Vertica 会移除所有表数据。

  • PRESERVE 会将临时表标记为会话范围数据,这些数据在单个事务结束后仍会保存。但会话结束后,Vertica 会移除所有表数据。

NO PROJECTION
防止 Vertica 为此表创建自动投影。仅当数据显式加载到此表中时才会创建超投影。

NO PROJECTION 对以下子句无效:

{INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES

默认继承此表的架构权限:

  • INCLUDE PRIVILEGES 指定在其架构上设置的表继承权限。如果启用了架构权限继承,则这是默认行为。

  • EXCLUDE PRIVILEGES 禁用从架构继承权限。

有关详细信息,请参阅继承的权限

ORDER BY table-column[,...]

对外部表无效,指定 SELECT 列表中的列,基于该列表对为此表自动创建的超投影进行排序。ORDER BY 子句不能包含限定符 ASCDESC。Vertica 始终按升序存储投影数据。

如果省略 ORDER BY 子句,Vertica 将使用 SELECT 列表顺序作为投影排序顺序。

segmentation-spec

对外部表无效,指定如何为此表的自动投影分发数据。提供以下子句之一:

如果省略此子句,Vertica 将生成自动投影,并使用默认哈希分段

KSAFE [safety-level]

对外部表无效,指定为此表创建的 自动投影K-safety,其中 k‑num 必须等于或大于系统 K-safety。如果您省略此选项,投影将使用系统 K-safety 水平。

Eon 模式: 无论系统 K-safety 如何,临时表的 K-safety 始终设置为 0。如果 CREATE TEMPORARY TABLE 语句将 k‑num 设置为大于 0,Vertica 会返回警告。

column-name-list

只有从查询 ( AS query) 创建表时有效,定义映射到查询输出的列名称。如果忽略此列表,Vertica 将使用查询输出列名称。

该子句和 ENCODED BY 子句互斥。列名称列表对外部表无效。

column-name-list 中的名称必须与查询列的个数相同。

例如:

CREATE TEMP TABLE customer_occupations (name, profession)
   AS SELECT customer_name, occupation FROM customer_dimension;
AS query

根据查询结果创建并加载一个表,按如下方式指定:


AS  [ /*+ LABEL */ ] [ AT {{< codevar >}}epoch{{< /codevar >}} ] query

查询不能包含复杂类型的列。

ENCODED BYcolumn-ref-list

该列表中的列来自源表且以逗号分隔,其中每列由以下一个或两个编码选项限定:

  • ACCESSRANK integer:覆盖列的默认访问等级,对于确定列访问的优先级很有用。请参阅确定列访问速度的优先级

  • ENCODING encoding-type: 指定要在列上使用的编码的类型。默认编码类型为“AUTO”。

此选项和 column-name-list 是互斥的。此选项对于外部表无效。

DISK_QUOTA配额
字符串,一个整数,后跟支持的单位:K、M、G 或 T。如果架构设置了配额,则此值必须小于架构配额。导致表的使用率超出设置配额的数据加载和 ILM 操作失败。有关详细信息,请参阅磁盘配额

如果未指定,则表没有配额。

磁盘配额对全局临时表有效,对本地临时表无效。

特权

必须具有以下权限:

  • 对表架构的 CREATE 权限

  • 如果创建包含命名序列的临时表:

    • 对于序列对象的 SELECT 权限

    • 对于序列架构的 USAGE 权限

限制

  • 对临时表的查询与对持久表的查询面临相同的 SQL 支持限制。

  • 不可以将投影添加到非空的全局临时表 (ON COMMIT PRESERVE ROWS)。请确保投影在加载数据之前已存在。请参阅自动投影

  • 尽管可以为定义时指定了 ON COMMIT DELETE ROWS 的临时表添加投影,但需要注意的是,您可能会丢失所有数据。

  • 无法对会话范围临时数据执行合并操作。

  • 一般来说,使用系统(虚拟)表时,会话范围临时表数据不可见。

  • 临时表不会恢复。如果某个节点发生故障,使用临时表的查询也会失败。重新启动会话并填充临时表。

  • 本地临时表不能设置磁盘配额。

示例

请参阅创建临时表

另请参阅