CREATE TABLE AS

Name

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

Synopsis

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [, ...] ) ] [ [ WITH | WITHOUT ] OIDS ]

    AS query

描述

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

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

参数

GLOBAL or LOCAL

忽略兼容性。请参考 CREATE TABLE 获取细节。

TEMPORARY 或 TEMP

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

table_name

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

column_name

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

WITH OIDS
WITHOUT OIDS

这个选项子句声明 CREATE TABLE AS 创建的表是否应该包含 OID。 如果两个子句都没有声明,那么使用配置参数 default_with_oids 的值。

query

一个查询语句(也就是一条 SELECT 命令或者一条运行准备好的 SELECT 命令的 EXECUTE 命令),请分别参考 SELECT 或者 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。 虽然这个变量当前缺省为真,但是将来很有可能改变。引起,那些要求 CREATE TABLE AS 创建的表应该包含 OID 的应用应该明确声明 WITH OIDS 以确保和将来的PostgreSQL版本兼容。

例子

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

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

兼容性

CREATE TABLE AS 由 SQL:2003 标准声明。 在 SQL:2003 的定义和 PostgreSQL 的实现里面有些小的区别:

又见

CREATE TABLE, SELECT, SELECT INTO