SELECT INTO

用于根据查询创建表的 SQL 命令

SELECT INTO 是一个 DDL 命令,用于基于查询结果创建表。

SELECT INTO 一直存在于 PostgreSQL 中。

用法

SELECT INTO 将根据提供的 SELECT 查询创建表。列名(除非使用 AS 显式修改)和数据类型将由 SELECT 查询生成。请注意,不会创建任何约束或索引,如果需要,则需要手动添加。

替代方案

备注

ECPGPL/pgSQL 中,SELECT INTO 用于将查询结果选入标量变量。

变更历史

示例

SELECT INTO 的基本用法示例

postgres=# CREATE TABLE foo (id INT NOT NULL PRIMARY KEY, val TEXT);
CREATE TABLE

postgres=# INSERT INTO foo VALUES(generate_series(1,100), clock_timestamp()); 
INSERT 0 100

postgres=# SELECT * INTO bar FROM foo WHERE id % 2 = 1;
SELECT 50

postgres=# SELECT COUNT(*) FROM bar;
 count
-------
    50
(1 row)

创建的表将没有任何索引、约束或其他属性,即使它生成的查询仅引用单个源表

postgres=# \d bar
                Table "public.bar"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           |          |
 val    | text    |           |          |

要克隆现有表的定义,可以使用 CREATE TABLE ... (LIKE ...),例如:

postgres=# CREATE TABLE baz (LIKE foo INCLUDING ALL);
CREATE TABLE

postgres=# \d baz
                Table "public.baz"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           | not null |
 val    | text    |           |          |
Indexes:
    "baz_pkey" PRIMARY KEY, btree (id)

postgres=# SELECT COUNT(*) FROM baz;
 count
-------
     0
(1 row)

目标表不能已存在

postgres=# SELECT * INTO bar FROM foo WHERE id % 2 = 0;
ERROR:  relation "bar" already exists

要从另一个表向现有表插入数据,请使用 INSERT INTO ... (SELECT ... FROM ...),例如:

postgres=# INSERT INTO bar (select * FROM foo where id %2 = 0);
INSERT 0 50

分类

DDL

另请参阅

CREATE TABLE AS, CREATE TABLE, CREATE VIEW, CREATE MATERIALIZED VIEW

反馈

就“SELECT INTO”提交任何评论、建议或更正,请在此处提交