SQL COMMAND · 表与视图
CREATE TABLE AS
根据查询结果定义一个新表
CREATE表与视图引入 10(基线)现存至 20 devel2 次语法变更
- 动词
CREATE- 对象
TABLE AS- 分组
- 表与视图
- 引入版本
- 10(基线)
- 状态
- 现存
- 语法变更次数
- 2
- 手册小节数
- 6
版本轨迹
相对 PostgreSQL 17 语法未变,正文有更新。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
语法概要
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ]table_name[ (column_name[, ...] ) ] [ USINGmethod] [ WITH (storage_parameter[=value] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEtablespace_name] ASquery[ 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新表中某一列的名称。如果未提供列名,则采用查询输出列的列名。
USINGmethod这个可选子句指定用于存储新表内容的表访问方法;该方法必须是
TABLE类型的访问方法。详见 Chapter 62。如果未指定此选项,则会为新表选择默认 的表访问方法。详见 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控制临时表在事务块结束时的 行为。三种选项是:PRESERVE ROWS在事务结束时不采取特殊动作。这是默认行为。
DELETE ROWS在每个事务块结束时都会删除临时表中的所有行。实质上,每次提 交时都会自动执行一次
TRUNCATE。DROP临时表会在当前事务块结束时被删除。
TABLESPACEtablespace_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 19← 18语法变化
+ CREATE [ persistence_mode ] TABLE [ IF NOT EXISTS ] table_name+ [ ( column_name [, ...] ) ]++ 其中 persistence_mode 为:++ { [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } } | UNLOGGED− CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name− [ (column_name [, ...] ) ]PostgreSQL 18← 17正文更新
正文更新PostgreSQL 15← 14正文更新
正文更新PostgreSQL 14← 13正文更新
正文更新PostgreSQL 13← 12正文更新
正文更新PostgreSQL 12← 11语法变化
+ [ USING method ]+ [ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]− [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]正文更新PostgreSQL 11← 10正文更新
正文更新
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
TRUNCATE | TRUNCATE | — | — | |
| 清空一个表或一组表 | 现存 | |||
CREATE MATERIALIZED VIEW | CREATE | MATERIALIZED VIEW | 121 次 | |
| 定义一个新物化视图 | 现存 | |||
ALTER MATERIALIZED VIEW | ALTER | MATERIALIZED VIEW | 142 次 | |
| 更改一个物化视图的定义 | 现存 | |||
DROP MATERIALIZED VIEW | DROP | MATERIALIZED VIEW | — | |
| 移除一个物化视图 | 现存 | |||
REFRESH MATERIALIZED VIEW | REFRESH | MATERIALIZED VIEW | — | |
| 替换物化视图的内容 | 现存 | |||
CREATE SEQUENCE | CREATE | SEQUENCE | 141 次 | |
| 定义一个新的序列发生器 | 现存 | |||
ALTER SEQUENCE | ALTER | SEQUENCE | 141 次 | |
| 更改序列发生器的定义 | 现存 | |||
DROP SEQUENCE | DROP | SEQUENCE | — | |
| 移除一个序列 | 现存 | |||
CREATE TABLE | CREATE | TABLE | 206 次 | |
| 定义一个新表 | 现存 | |||
ALTER TABLE | ALTER | TABLE | 206 次 | |
| 更改一个表的定义 | 现存 | |||
DROP TABLE | DROP | TABLE | — | |
| 移除一个表 | 现存 | |||
CREATE TABLE AS | CREATE | TABLE AS | 192 次 | |
| 根据查询结果定义一个新表 | 现存 | |||
CREATE VIEW | CREATE | VIEW | — | |
| 定义一个新视图 | 现存 | |||
ALTER VIEW | ALTER | VIEW | 142 次 | |
| 更改视图的定义 | 现存 | |||
DROP VIEW | DROP | VIEW | — | |
| 移除一个视图 | 现存 | |||