全部产品
Search
文档中心

云原生数据库 PolarDB:CREATE TABLE AS

更新时间:Apr 22, 2024

CREATE TABLE AS创建一个表,并且用由一个SELECT命令计算出来的数据填充该表。

简介

CREATE TABLE AS创建一个表,并且用由一个SELECT命令计算出来的数据填充该表。该表的列具有和SELECT的输出列相关的名称和数据类型(不过可以通过给出一个显式的新列名列表来覆盖这些列名)。

CREATE TABLE AS和创建一个视图有些相似,但是实际上非常不同:它会创建一个新表并且只计算该查询一次用来初始填充新表。这个新表将不会跟踪该查询源表的后续变化。相反, 一个视图只要被查询,它的定义SELECT 语句就会被重新计算。

语法

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

参数

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

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

  • UNLOGGED如果被指定,该表会被创建为一个LOGGED表。

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

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

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

  • USING method这个可选的子句指定了用于存储新表内容的表访问方法;该方法需要是一个类型 TABLE的访问方法。 如果没有指定这个选项,则选择新表的默认表访问方法。详见 default_table_access_method。

  • WITH ( storage_parameter [= value ] [, ... ] )这个子句为新表指定可选的存储参数,详见 CREATE TABLE 中的 Storage Parameters。 为了向后兼容,表的WITH子句也能包含OIDS=FALSE来指定新表的行将不包含 OID(对象标识符)。OIDS=TRUE不再支持。

  • WITHOUT OIDS这是向后兼容的语法,用于声明表WITHOUT OIDS,创建表WITH OIDS不再被支持。

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

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

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

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

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

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

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

说明

这个命令在功能上类似于SELECT INTO ,但是它更好, 因为不太可能被SELECT INTO语法的其他使用混淆。更进一步,CREATE TABLE AS提供了 SELECT INTO的功能的一个超集。

示例

创建一个新表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中最近的项组成,使用准备好的声明。新表将在提交时被丢弃:

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