=============== CREATE TABLE AS =============== .. container:: refentry :name: SQL-CREATETABLEAS .. container:: titlepage .. container:: refnamediv .. rubric:: CREATE TABLE AS :name: create-table-as CREATE TABLE AS — 从一个查询的结果创建一个新表 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name [ (column_name [, ...] ) ] [ WITH ( storage_parameter [= value] [, ... ] ) ] [ TABLESPACE tablespace_name ] AS query [ WITH [ NO ] DATA ] .. container:: refsect1 :name: id-1.9.3.86.5 .. rubric:: 描述 :name: 描述 ``CREATE TABLE AS``\ 创建一个表,并且用 由一个\ ``SELECT``\ 命令计算出来的数据填充 该表。该表的列具有和\ ``SELECT``\ 的输出列 相关的名称和数据类型(不过可以通过给出一个显式的新列名列表来覆 盖这些列名)。 ``CREATE TABLE AS``\ 和创建一个视图有些 相似,但是实际上非常不同:它会创建一个新表并且只计算该查询一次 用来初始填充新表。这个新表将不会跟踪该查询源表的后续变化。相反, 一个视图只要被查询,它的定义\ ``SELECT`` 语句就会被重新计算。 .. container:: refsect1 :name: id-1.9.3.86.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist ``GLOBAL``\ 或者\ ``LOCAL`` 为兼容性而忽略。不推荐使用这些关键词,详见 `CREATE TABLE `__\ 。 .. container:: variablelist ``TEMPORARY``\ 或者\ ``TEMP`` 如果被指定,该表会被创建为一个临时表。详见 `CREATE TABLE `__\ 。 ``UNLOGGED`` 如果被指定,该表会被创建为一个不做日志的表。详见 `CREATE TABLE `__\ 。 ``IF NOT EXISTS`` 如果已经存在一个同名的关系时不要抛出错误。这种情况下会发出一个 提示。详见\ `CREATE TABLE `__\ 。 *``table_name``* 要创建的表的名称(可以被模式限定)。 *``column_name``* 新表中一列的名称。如果没有提供列名,会从查询的输出列名中得到。 ``WITH ( storage_parameter`` [= *``value``*] [, ... ] ) 这个子句为新表指定可选的存储参数,详见 `存储参数 `__\ 。 为了向后兼容,表的\ ``WITH``\ 子句也能包含\ ``OIDS=FALSE``\ 来指定新表的行将不包含OID(对象标识符)。\ ``OIDS=TRUE``\ 不再支持。 ``TABLESPACE tablespace_name`` *``tablespace_name``* 是要在其中创建新表的表空间名称。如果没有指定,将会查询使用 *``default_tablespace``* *``query``* 一个\ ``SELECT``\ 、 ``TABLE``\ 或者 ``VALUES``\ 命令。 ``WITH [ NO ] DATA`` 这个子句指定查询产生的数据是否应该被复制到新表中。如果不是,只有 表结构会被复制。默认是复制数据。 .. container:: refsect1 :name: id-1.9.3.86.7 .. rubric:: 注解 :name: 注解 这个命令在功能上类似于\ ``SELECT INTO``,但是它更好, 因为不太可能被\ ``SELECT INTO``\ 语法的其他使用混淆。更 进一步,\ ``CREATE TABLE AS``\ 提供了 ``SELECT INTO``\ 的功能的一个超集。 .. container:: refsect1 :name: id-1.9.3.86.8 .. rubric:: 示例 :name: 示例 创建一个新表\ ``films_recent``\ ,它只由表 ``films``\ 中最近的项组成: .. code:: programlisting CREATE TABLE films_recent AS SELECT * FROM films WHERE date_prod >= '2002-01-01'; 要完全地复制一个表,也可以使用\ ``TABLE``\ 命令的 简短形式: .. code:: programlisting CREATE TABLE films2 AS TABLE films; .. container:: refsect1 :name: id-1.9.3.86.9 .. rubric:: 兼容性 :name: 兼容性 ``CREATE TABLE AS``\ 符合 SQL标准。下面的是非标准扩展: .. container:: itemizedlist - 标准要求在子查询子句周围有圆括号,在 OushuDB中这些圆括号是可选的。 - 在标准中,\ ``WITH [ NO ] DATA``\ 子句是必要的,而 OushuDB 中是可选的。 - OushuDB处理临时表的方式和标准不同。 详见\ `CREATE TABLE `__\ 。 - ``WITH``\ 子句是一种 OushuDB扩展, 标准中没有存储参数。 - OushuDB的表空间概念是标准的 一部分。因此,子句\ ``TABLESPACE``\ 是一种扩展。 .. container:: refsect1 :name: id-1.9.3.86.10 .. rubric:: 另见 :name: 另见 `CREATE MATERIALIZED VIEW `__, `CREATE TABLE `__, `EXECUTE `__, `SELECT `__, `SELECT INTO `__, `VALUES `__