Postgresql 中文操作指南
Synopsis
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 ]
Description
CREATE TABLE AS 创建一个表,并用 SELECT 命令计算的数据填充该表。表列具有与 SELECT 的输出列关联的名称和数据类型(但您可以通过给出一个新的显式列名列表来覆盖列名)。
CREATE TABLE AS 与创建视图有一些相似之处,但实际上有很大不同:它创建了一个新表,并仅计算一次查询以最初填充新表。新表不会跟踪源表的后续更改。相比之下,视图只要查询就会重新计算其定义的 SELECT 语句。
CREATE TABLE AS 要求对用于表的架构有 CREATE 权限。
Parameters
-
GLOBAL or LOCAL
-
为兼容而忽略。弃用这些关键字的使用;有关详细信息,请参阅 CREATE TABLE 。
-
-
TEMPORARY or TEMP
-
如果指定,则该表将作为临时表创建。有关详细信息,请参阅 CREATE TABLE 。
-
-
UNLOGGED
-
如果指定,则该表将作为未记录表创建。有关详细信息,请参阅 CREATE TABLE 。
-
-
IF NOT EXISTS
-
如果已经存在同名关系,则不抛出错误;只发出通知并保持表不变。
-
-
table_name
-
要创建的表名(可选地经过架构限定)。
-
-
column_name
-
新表中列的名称。如果没有提供列名,则从查询的输出列名中获取。
-
-
USING _method_
-
此可选子句指定用于存储新表内容的表访问方法;该方法需要是类型为 TABLE 的访问方法。有关详细信息,请参阅 Chapter 63 。如果未指定此选项,则为新表选择默认表访问方法。有关详细信息,请参阅 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_name_
-
tablespace_name 是要创建新表的表空间的名称。如果未指定,则查询 default_tablespace ,如果是临时表,则查询 temp_tablespaces 。
-
-
query
-
WITH [ NO ] DATA
-
此子句指定是否应将查询产生的数据复制到新表中。如果不复制,则只复制表结构。默认行为是复制数据。
-
-
PRESERVE ROWS
-
事务结束时不会执行任何特殊操作。这是默认行为。
-
-
DELETE ROWS
-
临时表中的所有行都将在每个事务块的结尾处被删除。基本上,每次提交时都会自动 TRUNCATE 。
-
-
DROP
-
临时表将在当前事务块的结尾处被删除。
-
Notes
此命令在功能上与 SELECT INTO 类似,但由于不太可能与 SELECT INTO 语法的其他用法混淆,因此更受青睐。此外, CREATE TABLE AS 提供了 SELECT INTO 所提供功能的超集。
Examples
创建新表 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');