CREATE TABLE AS — 从查询结果定义新表
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ]table_name
[ (column_name
[, ...] ) ] [ USINGmethod
] [ WITH (storage_parameter
[=value
] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEtablespace_name
] ASquery
[ WITH [ NO ] DATA ]
CREATE TABLE AS
创建一个表,并使用 SELECT
命令计算的数据填充该表。表列具有与 SELECT
输出列关联的名称和数据类型(但您可以通过提供显式的新列名称列表来覆盖列名称)。
CREATE TABLE AS
与创建视图有一些相似之处,但实际上完全不同:它创建一个新表,并且只评估查询一次,以最初填充新表。新表不会跟踪查询源表的后续更改。相反,视图在每次查询时都会重新评估其定义的 SELECT
语句。
CREATE TABLE AS
需要对用于该表的模式具有 CREATE
权限。
GLOBAL
或 LOCAL
为了兼容性而忽略。这些关键字的使用已被弃用;有关详细信息,请参阅 CREATE TABLE。
TEMPORARY
或 TEMP
如果指定,则该表将作为临时表创建。有关详细信息,请参阅 CREATE TABLE。
UNLOGGED
如果指定,则该表将作为非日志表创建。有关详细信息,请参阅 CREATE TABLE。
IF NOT EXISTS
如果已经存在具有相同名称的关系,则不要抛出错误;只需发出通知并保持表不变。
table_name
要创建的表的名称(可选地限定模式)。
column_name
新表中的一列的名称。如果未提供列名称,则从查询的输出列名称中获取它们。
USING method
此可选子句指定用于存储新表内容的表访问方法;该方法需要是类型为 TABLE
的访问方法。有关更多信息,请参阅 第 61 章。如果未指定此选项,则会为新表选择默认表访问方法。有关更多信息,请参阅 default_table_access_method。
WITH ( storage_parameter
[= value
] [, ... ] )
此子句指定新表的可选存储参数;有关更多信息,请参阅 存储参数 在 CREATE TABLE 文档中。为了向后兼容,表的 WITH
子句也可以包含 OIDS=FALSE
,以指定新表的行不应包含 OID(对象标识符),OIDS=TRUE
不再支持。
WITHOUT OIDS
这是声明表 WITHOUT OIDS
的向后兼容语法,不再支持创建表 WITH OIDS
。
ON COMMIT
可以使用 ON COMMIT
控制事务块结束时临时表的行为。三个选项是
PRESERVE ROWS
在事务结束时不采取任何特殊操作。这是默认行为。
DELETE ROWS
在每个事务块结束时,将删除临时表中的所有行。本质上,在每次提交时都会自动执行 TRUNCATE
。
DROP
在当前事务块结束时,将删除临时表。
TABLESPACE tablespace_name
tablespace_name
是要创建新表的表空间的名称。如果未指定,则会咨询 default_tablespace,或者如果该表是临时表,则咨询 temp_tablespaces。
query
一个 SELECT
、TABLE
或 VALUES
命令,或者一个 EXECUTE
命令,该命令运行准备好的 SELECT
、TABLE
或 VALUES
查询。
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');
CREATE TABLE AS
符合SQL标准。以下是非标准扩展
标准要求子查询子句周围有括号;在 PostgreSQL 中,这些括号是可选的。
在标准中,WITH [ NO ] DATA
子句是必需的;在 PostgreSQL 中,它是可选的。
PostgreSQL 处理临时表的方式与标准略有不同;有关详细信息,请参阅 CREATE TABLE。
WITH
子句是 PostgreSQL 的扩展;存储参数不在标准中。
PostgreSQL 中表空间的概念不是标准的一部分。因此,TABLESPACE
子句是一个扩展。
如果您在文档中发现任何错误,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。