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 语句。
忽略。仅仅为了兼容性而存在。请参考 CREATE TABLE 获取细节。
如果声明了这个选项,则该表作为临时表创建。参阅 CREATE TABLE 获取细节。
要创建的表名(可以用模式修饰)
字段的名称。如果没有提供字段名字,那么就从查询的输出字段名中获取。如果表是从一个 EXECUTE 命令创建的,那么就不能声明字段名列表。
这个子句为新表指定了可选的存储参数;参见存储参数获取更多信息。WITH 子句还可以包含 OIDS=TRUE 或 OIDS 来为新表中的行分配和存储 OID(对象表示符);或者用 OIDS=FALSE 表示不分配 OID 。参见 CREATE TABLE 获取更多信息。
这些是反对使用的、分别等价于 WITH (OIDS) 和 WITH (OIDS=FALSE) 的语法。
控制临时表在事务块结尾的行为。可用的三个选项如下:
不采取任何特别的动作,这是缺省。
删除临时表中的所有行。本质上是在每次提交事务后自动执行一个 TRUNCATE 命令。
删除临时表
指定新表将要在 tablespace 表空间内创建。如果没有声明,将使用 default_tablespace ,如果 default_tablespace 为空,那么将使用数据库的缺省表空间。
一个 SELECT 或 VALUES 命令或者一个运行预备好的 SELECT 或 VALUES 查询的 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 子句也是扩展。