VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

CREATE TABLE AS

CREATE TABLE AS - 根据查询结果定义新表

语法格式

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
    [ (column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE tablespace_name ]
    AS query
    [ WITH [ NO ] DATA ]

说明

CREATE TABLE AS 创建一个表并使用 SELECT 命令计算的数据填充它。表列具有与SELECT的输出列关联的名称和数据类型(除非您可以通过提供新列名称的显式列表来覆盖列名称)。

CREATE TABLE AS与创建视图有一些相似之处,但它确实完全不同:它创建一个新表并仅对查询进行一次评估以最初填充新表。新表不会跟踪对查询源表的后续更改。相反,每当查询时,视图都会重新评估其定义的SELECT 语句。

参数说明

  • GLOBAL或者LOCAL

    为兼容性而忽略。不推荐使用这些关键词,详见 CREATE TABLE。

  • TEMPORARY或者TEMP

    如果被指定,该表会被创建为一个临时表。详见 CREATE TABLE。

  • UNLOGGED

    如果被指定,该表会被创建为一个不做日志的表。详见 CREATE TABLE。

  • IF NOT EXISTS

    如果已经存在一个同名的关系时不要抛出错误。这种情况下会发出一个 提示。详见CREATE TABLE。

  • table_name

    要创建的表的名称(可以被模式限定)。

  • column_name

    新表中一列的名称。如果没有提供列名,会从查询的输出列名中得到。

  • WITH ( storage_parameter [= value] [, … ] )

    这个子句为新表指定可选的存储参数,详见 存储参数。 WITH子句也能包括OIDS=TRUE(或者只是 OIDS)来指定新表的行应该被分配 OID (对象标识符), 或者包括OIDS=FALSE来指定行没有 OID。详见 CREATE TABLE。

  • WITH OIDS

  • WITHOUT OIDS

    这些是分别等效于WITH (OIDS)和 WITH (OIDS=FALSE)的即将过时的语法。如果你希望同时 给出OIDS设置和存储参数,你必须使用 WITH ( … )语法,见上文。

  • ON COMMIT

    临时表在事务块结束时的行为可以用ON COMMIT 控制。三个选项是:

  • PRESERVE ROWS

    在事务结束时不采取特殊的动作。这是默认行为。

  • DELETE ROWS

    在每一个事务块结束时临时表中的所有行都将被删除。本质上, 在每次提交时会完成一次自动的TRUNCATE。

  • DROP

    在当前事务块结束时将删掉临时表。

  • TABLESPACE tablespace_name

    tablespace_name 是要在其中创建新表的表空间名称。如果没有指定,将会查询 default_tablespace,临时表会查询 temp_tablespaces。

  • query

    一个SELECT、TABLE或者VALUES 命令,或者是一个运行准备好的SELECT、 TABLE或者 VALUES查询的EXECUTE命令。

  • WITH [ NO ] DATA

    这个子句指定查询产生的数据是否应该被复制到新表中。如果不是,只有 表结构会被复制。默认是复制数据。

注意事项

此命令在功能上与 SELECT INTO类似,但它是首选的,因为它不太可能与SELECT INTO 语法的其他用法混淆。此外, CREATE TABLE AS 提供了 SELECT INTO 提供的功能的超集。

CREATE TABLE AS命令允许用户显式指定是否应包含OID。如果未明确指定OID的存在,则使用default_with_oids配置变量。

示例

创建一个新表 films_recent ,该表仅包含表 films 中的最近条目:

CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

要完全复制表,还可以使用使用 TABLE 命令的简短表单:

CREATE TABLE films2 AS
  TABLE films;

使用预准备语句创建一个新的临时表 films_recent ,该表仅包含表 films中的最近条目。新表有OID,将在提交时删除:

PREPARE recentfilms(date) AS
  SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_recent WITH (OIDS) ON COMMIT DROP AS
  EXECUTE recentfilms('2002-01-01');