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 语句。
忽略兼容性。请参考 CREATE TABLE 获取细节。
如果声明了这个选项,则该表作为临时表创建。 参阅 CREATE TABLE 获取细节。
要创建的表名(可以是用模式修饰的)。
字段的名称。如果没有提供字段名字,那么就从查询的输出字段名中获取。 如果表是从一个 EXECUTE 命令创建的, 那么就不能声明字段名列表。
这个选项子句声明 CREATE TABLE AS 创建的表是否应该包含 OID。 如果两个子句都没有声明,那么使用配置参数 default_with_oids 的值。
一个查询语句(也就是一条 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。 到了 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';
CREATE TABLE AS 兼容 SQL 标准,只有下面几个小区别:
标准要求在子查询子句周围有圆括弧,在 PostgreSQL 里, 这些圆括弧是可选的。
标准定义了一个 ON COMMIT 子句,目前 PostgreSQL 还没有实现。
标准定义了一个 WITH [NO] DATA 子句;这个目前在 PostgreSQL 里还没有实现。 PostgreSQL 提供的行为等于标准的 WITH DATA。
WITH/WITHOUT OIDS 是一个 PostgreSQL 扩展。
PostgreSQL 处理临时表的方法和标准相差较大;参阅 CREATE TABLE 获取细节。