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 or LOCAL为兼容性而被忽略。这些关键字已不推荐使用;详情请参见 CREATE TABLE。
TEMPORARY or TEMP如果指定,该表将被创建为临时表。详情请参见 CREATE TABLE。
UNLOGGED如果指定,该表将被创建为非日志表。详情请参见 CREATE TABLE。
IF NOT EXISTS如果已经存在同名的关系,则不抛出错误;只是发出一个通知,并保持该表不变。
table_name要创建的表的名称(可选带模式限定)。
column_name新表中某一列的名称。如果不提供列名,则将从查询的输出列名中取得列名。
USING method 该可选子句指定用于存储新表内容的表访问方法;该方法必须是 TABLE 类型的访问方法。更多信息请参见 Chapter 62。如果未指定该选项,则会为新表选择默认的表访问方法。更多信息请参见 default_table_access_method。
WITH ( storage_parameter [= value] [, ... ] ) 该子句为新表指定可选的存储参数;更多信息请参见 Storage Parameters(在 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 子句是一个扩展。