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 对以下子句无效:
-
ORDER BY
-
KSAFE
-
任何分段子句(hash-segmentation-clause 或 unsegmented‑clause)。
-
{INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES
默认继承此表的架构权限:
-
INCLUDE PRIVILEGES 指定在其架构上设置的表继承权限。如果启用了架构权限继承,则这是默认行为。
-
EXCLUDE PRIVILEGES 禁用从架构继承权限。
有关详细信息,请参阅继承的权限。
-
-
ORDER BY table-column[,...]
对外部表无效,指定
SELECT
列表中的列,基于该列表对为此表自动创建的超投影进行排序。ORDER BY
子句不能包含限定符ASC
或DESC
。Vertica 始终按升序存储投影数据。如果省略
ORDER BY
子句,Vertica 将使用SELECT
列表顺序作为投影排序顺序。- segmentation-spec
对外部表无效,指定如何为此表的自动投影分发数据。提供以下子句之一:
-
hash‑segmentation‑clause:指定将数据均匀分段并分布在群集节点上。Vertica 建议对大表进行分段。
-
unsegmented‑clause:指定以创建未分段的投影。
-
-
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 BY
column-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 的临时表添加投影,但需要注意的是,您可能会丢失所有数据。
-
无法对会话范围临时数据执行合并操作。
-
一般来说,使用系统(虚拟)表时,会话范围临时表数据不可见。
-
临时表不会恢复。如果某个节点发生故障,使用临时表的查询也会失败。重新启动会话并填充临时表。
-
本地临时表不能设置磁盘配额。
示例
请参阅创建临时表。