SELECT INTO 是一个 DDL 命令,用于基于查询结果创建表。
SELECT INTO 一直存在于 PostgreSQL 中。
用法
SELECT INTO 将根据提供的 SELECT 查询创建表。列名(除非使用 AS 显式修改)和数据类型将由 SELECT 查询生成。请注意,不会创建任何约束或索引,如果需要,则需要手动添加。
替代方案
CREATE TABLE AS提供了类似的功能,但有更多选项,并且更符合 SQL 标准。CREATE TABLE ... (LIKE ...)可用于“克隆”现有表的定义,但不能同时填充它。
备注
在 ECPG 和 PL/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
参考资料
- PostgreSQL 文档: SELECT INTO
