返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

CREATE TABLE AS

发布于 2019-09-30 03:11:03 字数 4071 浏览 992 评论 0 收藏 0

名称

CREATE TABLE AS--从一条查询的结果中定义一个新表

语法

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
    [ (column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE tablespace ]
    AS query

描述

CREATE TABLE AS 创建一个表并且用来自 SELECT 命令的结果填充该表。该表的字段和 SELECT 输出字段的名字及类型相关。不过你可以通过明确地给出一个字段名字列表来覆盖 SELECT 输出字段的名字。

CREATE TABLE AS 和创建视图有点像,不过两者之间实在是差异很大:它创建一个新表并且只对查询计算一次来填充这个新表。新表不能跟踪源表的变化。相比之下,每次做查询的时候,视图都重新计算定义它的 SELECT 语句。

参数

GLOBALLOCAL

忽略。仅仅为了兼容性而存在。请参考 CREATE TABLE 获取细节。

TEMPORARYTEMP

如果声明了这个选项,则该表作为临时表创建。参阅 CREATE TABLE 获取细节。

table_name

要创建的表名(可以用模式修饰)

column_name

字段的名称。如果没有提供字段名字,那么就从查询的输出字段名中获取。如果表是从一个 EXECUTE 命令创建的,那么就不能声明字段名列表。

WITH ( storage_parameter [= value] [, ... ] )

这个子句为新表指定了可选的存储参数;参见存储参数获取更多信息。WITH 子句还可以包含 OIDS=TRUEOIDS 来为新表中的行分配和存储 OID(对象表示符);或者用 OIDS=FALSE 表示不分配 OID 。参见 CREATE TABLE 获取更多信息。

WITH OIDS
WITHOUT OIDS

这些是反对使用的、分别等价于 WITH (OIDS)WITH (OIDS=FALSE) 的语法。

ON COMMIT

控制临时表在事务块结尾的行为。可用的三个选项如下:

PRESERVE ROWS

不采取任何特别的动作,这是缺省。

DELETE ROWS

删除临时表中的所有行。本质上是在每次提交事务后自动执行一个 TRUNCATE 命令。

DROP

删除临时表

TABLESPACE tablespace

指定新表将要在 tablespace 表空间内创建。如果没有声明,将使用 default_tablespace ,如果 default_tablespace 为空,那么将使用数据库的缺省表空间。

query

一个 SELECTVALUES 命令或者一个运行预备好的 SELECTVALUES 查询的 EXECUTE 命令。

注意

这条命令在功能上等效于 SELECT INTO ,但是更建议你用这个命令,因为它不太可能和 SELECT INTO 语法的其它方面混淆。另外,CREATE TABLE AS 提供了 SELECT INTO 功能的超集。

在 PostgreSQL 8.0 之前,CREATE TABLE AS 总是在它创建的表中包含 OID ,而在 PostgresSQL 8.0 里,CREATE TABLE AS 命令允许明确声明是否应该包含 OID 。如果没有明确声明是否应该包含 OID ,那么使用配置变量 default_with_oids 的设置。到了 PostgreSQL 8.1 这个变量缺省为假,缺省行为和 8.0 之前的版本不同。因此,那些要求 CREATE TABLE AS 创建的表包含 OID 的应用应该明确声明 WITH (OIDS) 以确保正确的行为。

例子

创建一个只包含表 films 中最近的记录的新表 films_recent

CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

使用预备语句创建一个只包含表 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');

兼容性

CREATE TABLE AS 兼容 SQL 标准,只有下面几个小区别:

  • 标准要求在子查询子句周围有圆括弧,在 PostgreSQL 里,这些圆括弧是可选的。

  • 标准定义了一个 WITH [ NO ] DATA 子句;这个目前在 PostgreSQL 里还没有实现。PostgreSQL 提供的行为相当于标准的 WITH DATA 情况。WITH NO DATA 在查询后面附加 LIMIT 0 进行模拟。

  • PostgreSQL 处理临时表的方法和标准相差较大;参阅 CREATE TABLE 获取细节。

  • WITH 子句是 PostgreSQL 扩展,并且 SQL 标准中也没有存储参数和 OID 。

  • PostgreSQL 表空间的概念也不是标准的一部分。因此 TABLESPACE 子句也是扩展。

又见

CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文