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 ASCREATE TABLECREATE VIEWCREATE MATERIALIZED VIEW

反馈

提交任何关于“SELECT INTO”的评论、建议或更正 此处