On this page
创建表为
CREATE TABLE AS —根据查询结果定义一个新表
Synopsis
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
[ (column_name [, ...] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
AS query
[ WITH [ NO ] DATA ]
Description
CREATE TABLE AS
创建一个表,并用SELECT
命令计算出的数据填充该表。表列具有与SELECT
的输出列关联的名称和数据类型(但可以通过提供新列名的显式列表来覆盖列名)。
CREATE TABLE AS
与创建视图有些相似,但实际上是完全不同的:它创建一个新表并仅对查询进行一次评估以最初填充新表。新表将不会跟踪对查询源表的后续更改。相反,无论何时查询,视图都会重新评估其定义的SELECT
语句。
Parameters
GLOBAL
或LOCAL
- 忽略兼容性。不建议使用这些关键字;有关详情,请参阅CREATE TABLE。
TEMPORARY
或TEMP
- 如果指定,该表将被创建为临时表。有关详情,请参阅CREATE TABLE。
UNLOGGED
- 如果指定,该表将创建为未记录表。有关详情,请参阅CREATE TABLE。
IF NOT EXISTS
- 如果已经存在同名关系,则不要抛出错误。在这种情况下发出通知。有关详情,请参阅CREATE TABLE。
table_name
- 要创建的表的名称(可选的模式限定)。
column_name
- 新表中的列名。如果未提供列名,则它们取自查询的输出列名。
WITH ( storage_parameter [= value] [, ... ] )
- 此子句为新表指定了可选的存储参数。有关更多信息,请参见Storage Parameters。
WITH
子句还可以包含OIDS=TRUE
(或仅包含OIDS
)以指定新表的行应具有为其分配的 OID(对象标识符),或OIDS=FALSE
可以指定该行不应具有 OID。有关更多信息,请参见CREATE TABLE。
- 此子句为新表指定了可选的存储参数。有关更多信息,请参见Storage Parameters。
WITH OIDS
WITHOUT OIDS
- 这些是分别等于
WITH (OIDS)
和WITH (OIDS=FALSE)
的过时语法。如果希望同时提供OIDS
设置和存储参数,则必须使用WITH ( ... )
语法;往上看。
- 这些是分别等于
ON COMMIT
- 可以使用
ON COMMIT
来控制事务块末尾的临时表的行为。这三个选项是:
- 可以使用
PRESERVE ROWS
Transaction 结束时不会采取任何特殊措施。这是默认行为。
DELETE ROWS
- 临时表中的所有行将在每个事务块的末尾删除。本质上,每次提交都会自动执行TRUNCATE。
DROP
- 临时表将在当前事务块的末尾删除。
TABLESPACE tablespace_name
-
tablespace_name
*是要在其中创建新表的表空间的名称。如果未指定,则查询default_tablespace,如果表是临时的,则查询temp_tablespaces。
-
query
WITH [ NO ] DATA
- 此子句指定是否将查询产生的数据复制到新表中。如果不是,则仅复制表结构。默认为复制数据。
Notes
该命令在功能上类似于SELECT INTO,但是它是首选的,因为它不太可能与SELECT INTO
语法的其他用法混淆。此外,CREATE TABLE AS
提供SELECT INTO
提供的功能的超集。
CREATE TABLE AS
命令允许用户明确指定是否应包含 OID。如果未明确指定 OID 的存在,则使用default_with_oids配置变量。
Examples
创建一个仅由表films
的最新条目组成的新表films_recent
:
CREATE TABLE films_recent AS
SELECT * FROM films WHERE date_prod >= '2002-01-01';
要完全复制表,还可以使用使用TABLE
命令的缩写形式:
CREATE TABLE films2 AS
TABLE films;
使用准备好的语句创建一个仅由表films
的最新条目组成的新临时表films_recent
。新表具有 OID,并将在提交时删除:
PREPARE recentfilms(date) AS
SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_recent WITH (OIDS) ON COMMIT DROP AS
EXECUTE recentfilms('2002-01-01');
Compatibility
CREATE TABLE AS
符合 SQL 标准。以下是非标准扩展:
该标准要求在子查询子句周围加上括号;在 PostgreSQL 中,这些括号是可选的。
在标准中,
WITH [ NO ] DATA
子句是必需的;在 PostgreSQL 中,它是可选的。PostgreSQL 处理临时表的方式与标准完全不同。有关详情,请参见CREATE TABLE。
WITH
子句是 PostgreSQL 扩展;存储参数和 OID 都不在标准中。PostgreSQL 表空间的概念不是标准的一部分。因此,子句
TABLESPACE
是 extensions。