CREATE TABLE AS
CREATE TABLE AS — 根据查询结果定义一个新表
大纲
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 ]
描述
CREATE TABLE AS 创建一个表,并用
SELECT 命令计算得到的数据填充该表。该表的列具有与 SELECT 输出列对应的名称和数据类型(但可以通过显式给出新的列名列表来覆盖列名)。
CREATE TABLE AS 与创建视图有些相似,但实际上差异很大:它会创建一个新表,并且只执行一次该查询来完成新表的初始填充。这个新表不会跟踪该查询所引用源表的后续变化。相比之下,视图每次被查询时都会重新执行其定义中的
SELECT 语句。
CREATE TABLE AS 要求在用于该表的模式上具有
CREATE 权限。
参数
GLOBAL或LOCAL#出于兼容性考虑,这些关键字会被忽略。它们的用法已废弃;详见 CREATE TABLE。
TEMPORARY或TEMP#如果指定,将把该表创建为临时表。详见 CREATE TABLE。
UNLOGGED#如果指定,该表将创建为不记录 WAL 的表。详见 CREATE TABLE。
IF NOT EXISTS#如果已存在同名关系,则不抛出错误,而是发出一条提示,并保持现有关系不变。
table_name#要创建的表名(可选地带模式限定)。
column_name#新表中某一列的名称。如果未提供列名,则采用查询输出列的列名。
USING#method这个可选子句指定用于存储新表内容的表访问方法;该方法必须是
TABLE类型的访问方法。详见第 61 章。如果未指定此选项,则会为新表选择默认的表访问方法。详见 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控制临时表在事务块结束时的行为。三种选项是:TABLESPACE#tablespace_nametablespace_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子句是一种扩展。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.