CREATE TABLE AS — 从一个查询的结果创建一个新表
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 } ] [ COMPRESS | NOCOMPRESS | LOGGING | NOLOGGING | COMPRESS LOGGING | COMPRESS NOLOGGING | NOCOMPRESS LOGGING | NOCOMPRESS NOLOGGING | LOGGING COMPRESS | LOGGING NOCOMPRESS | NOLOGGING COMPRESS | NOLOGGING NOCOMPRESS ] [ STORAGE(...) ] [ TABLESPACEtablespace_name
] ASquery
[ WITH [ NO ] DATA ]
CREATE TABLE AS
创建一个表,并且用
由一个SELECT
命令计算出来的数据填充
该表。该表的列具有和SELECT
的输出列
相关的名称和数据类型(不过可以通过给出一个显式的新列名列表来覆
盖这些列名)。
CREATE TABLE AS
和创建一个视图有些
相似,但是实际上非常不同:它会创建一个新表并且只计算该查询一次
用来初始填充新表。这个新表将不会跟踪该查询源表的后续变化。相反,
一个视图只要被查询,它的定义SELECT
语句就会被重新计算。
GLOBAL
或者LOCAL
为兼容性而忽略。不推荐使用这些关键词,详见 CREATE TABLE(含分布式)。
TEMPORARY
或者TEMP
如果被指定,该表会被创建为一个临时表。详见 CREATE TABLE(含分布式)。
UNLOGGED
如果被指定,该表会被创建为一个不做日志的表。详见 CREATE TABLE(含分布式)。
IF NOT EXISTS
如果已存在同名关系,则不要抛出错误;只需发出通知并保持表不变。
table_name
要创建的表的名称(可以被模式限定)。
column_name
新表中一列的名称。如果没有提供列名,会从查询的输出列名中得到。
USING method
这个可选的子句指定了用于存储新表内容的表访问方法;该方法需要是一个类型 TABLE
的访问方法。
如果没有指定这个选项,则选择新表的默认表访问方法。详见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
在当前事务块结束时将删掉临时表。
COMPRESS LOGGING
为了兼容Oracle数据库语法,新增了四个非保留关键字COMPRESS
, LOGGING
, NOCOMPRESS
, NOLOGGING
。
这四个关键字仅是语法糖,没有实现实际的功能。这四个关键字是可选的,如果必须要使用,请放在TABLESPACE
关键字之前。
STORAGE
为了兼容Oracle数据库语法,CREATE TABLE AS
语句支持STORAGE
关键字。STORAGE
关键字后面括号内的内容是被忽略的。
STORAGE
关键字是可选的,如果一定要使用,请在COMPRESS LOGGING
关键字和TABLESPACE
关键字之间使用。
TABLESPACE tablespace_name
tablespace_name
是要在其中创建新表的表空间名称。如果没有指定,将会查询
default_tablespace,临时表会查询
temp_tablespaces。
query
一个SELECT
、TABLE
,或 VALUES
命令,
或者是一个运行准备好的SELECT
, TABLE
, 或者VALUES
查询的EXECUTE
命令。
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');
使用COMPRESS/NOCOMPRESS/LOGGING/NOLOGGING选项来创建表。
CREATE TABLE films_recent compress logging tablespace pg_default AS SELECT 10 age, 'xiaohong' name, 123456 id;
使用STORAGE选项来创建表。
CREATE TABLE films_recent compress logging storage(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) tablespace pg_default AS SELECT 10 age, 'xiaohong' name, 123456 id;
CREATE TABLE AS
符合
SQL标准。下面的是非标准扩展:
标准要求在子查询子句周围有圆括号,在 LightDB中这些圆括号是可选的。
在标准中,WITH [ NO ] DATA
子句是必要的,而
LightDB 中是可选的。
LightDB处理临时表的方式和标准不同。 详见CREATE TABLE(含分布式)。
WITH
子句是一种
LightDB扩展,
标准中没有存储参数。
LightDB的表空间概念是标准的
一部分。因此,子句TABLESPACE
是一种扩展。