PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# SELECT INTO

## 名称

SELECT INTO -- 从一条查询的结果中定义一个新表

## 大纲

    [ WITH [ RECURSIVE ] with_query [, ...] ]
    SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
        * | expression [ [ AS ] output_name ] [, ...]
        INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ] new_table
        [ FROM from_item [, ...] ]
        [ WHERE condition ]
        [ GROUP BY expression [, ...] ]
        [ HAVING condition [, ...] ]
        [ WINDOW window_name AS ( window_definition ) [, ...] ]
        [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
        [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
        [ LIMIT { count | ALL } ]
        [ OFFSET start [ ROW | ROWS ] ]
        [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
        [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]

## 描述

`SELECT INTO`从一个查询中创建一个新表,并且将查询到的数据插入到新表中。数据并不返回给客户端， 这一点和普通的`SELECT`不同。新表的字段具有和`SELECT` 的输出字段相同的名字和数据类型。

## 参数

`TEMPORARY` 或 `TEMP`

  如果声明了这个关键字，那么该表是作为一个临时表创建的。 请参考CREATE TABLE获取细节。

`UNLOGGED`

  如果指定了，那么表作为一个非日志表创建。参阅CREATE TABLE获取详细信息。

`new_table`

  要创建的表的名字(可以有模式修饰)。

所有其它参数都在SELECT中有详细描述。

## 注意

CREATE TABLE AS的作用和`SELECT INTO`类似。 建议使用`CREATE TABLE AS`语法。 实际上，它是不能在ECPG或PL/pgSQL中使用的， 因为它们对`INTO`子句的解释是不同的。而且，`CREATE TABLE AS` 提供了`SELECT INTO`所提供功能的超集。

要想在`SELECT INTO`创建的表里追加 OID ， 可以打开default_with_oids配置参数。 另外一个方法是使用带`WITH OIDS`子句的`CREATE TABLE AS`命令。

## 例子

创建一个新表`films_recent`，它的值包含来自`films`的最近的条目：

    SELECT * INTO films_recent FROM films WHERE date_prod >= '2002-01-01';

## 兼容性

SQL 标准用`SELECT INTO`表示选取数值到一个宿主程序的标量变量中， 而不是创建一个新表。这种用法实际上就是在ECPG (第 33 章) 和PL/pgSQL(第 40 章) 里的用途。PostgreSQL用`SELECT INTO` 创建表是历史原因。在新代码里最好使用`CREATE TABLE AS`实现这个目的。

## 又见

CREATE TABLE AS

上一页 | 起始页 | 下一页
SELECT | 上一级 | SET