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