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
如果指定,则该表将创建为未记录表。有关详细信息,请参阅 CREATE TABLE。
IF NOT EXISTS
如果已存在同名关系,则不抛出错误;只需发出通知并保持该表不变。
table_name
要创建的表的名称(可选模式限定)。
column_name
新表中列的名称。如果未提供列名,则从查询的输出列名中获取列名。
USING
method
此可选子句指定用于存储新表内容的表访问方法;该方法需要是
TABLE
类型的访问方法。有关详细信息,请参阅 第 63 章。如果未指定此选项,则为新表选择默认表访问方法。有关详细信息,请参阅 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_name
tablespace_name
是要创建新表所在表空间的名称。如果未指定,则会参考 default_tablespace,或如果表是临时表,则会参考 temp_tablespaces。查询
一个
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
是一个扩展。
另请参阅
CREATE MATERIALIZED VIEW、CREATE TABLE、EXECUTE、SELECT、SELECT INTO、VALUES