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