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 [ WITH [ NO ] DATA ]
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获取更多信息。
These are obsolescent syntaxes equivalent to WITH (OIDS) and WITH (OIDS=FALSE), respectively. If you wish to give both an OIDS setting and storage parameters, you must use the WITH ( ... ) syntax; see above.
这些是反对使用的、分别等价于WITH (OIDS) 和WITH (OIDS=FALSE)的语法。如果你想给定 OIDS设置和存储参数,你必须使用 WITH ( ... )语法;见上面。
使用ON COMMIT控制临时表在事务块结尾的行为。可用的三个选项如下:
不采取任何特别的动作,这是缺省。
删除临时表中的所有行。本质上是在每次提交事务后自动执行一个TRUNCATE命令。
在目前事务块结尾删除临时表
The tablespace is the name of the tablespace in which the new table is to be created. If not specified, default_tablespace is consulted, or temp_tablespaces if the table is temporary.
指定新表将要在tablespace表空间内创建。 如果没有声明,将查询default_tablespace, 如果表为空,那么将查询temp_tablespaces。
一个SELECT,TABLE, 或者VALUES命令或者一个运行预备好的SELECT,TABLE或者VALUES查询的EXECUTE命令。
该语句声明查询产生的数据是否应该被复制到新表中。若没有,则 仅仅复制了标准结构。默认是复制数据。
这条命令在功能上等效于SELECT INTO,但是更建议你用这个命令, 因为它不太可能和SELECT INTO语法的其它方面混淆。 另外,CREATE TABLE AS提供了SELECT INTO功能的超集。
在PostgreSQL之前,CREATE TABLE AS总是在它创建的表中包含OID , 而在PostgreSQL里,CREATE TABLE AS命令允许明确声明是否应该包含OID。 如果没有明确声明是否应该包含OID,那么使用配置变量default_with_oids的设置。 到了PostgreSQL8.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';
完全复制一个表,使用TABLE的简短形式也可以被使用:
CREATE TABLE films2 AS TABLE films;
使用预备语句创建一个只包含表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中是可选的。
标准需要一个WITH [ NO ] DATA子句;在PostgreSQL里是可选的。
PostgreSQL处理临时表的方法和标准相差较大; 参阅CREATE TABLE获取细节。
WITH子句是PostgreSQL扩展, 并且SQL标准中也没有存储参数和OID 。
PostgreSQL表空间的概念也不是标准的一部分。 因此TABLESPACE子句也是扩展。