CREATE TABLE AS
是一个DDL命令,用于根据查询结果定义一个新表。
CREATE TABLE AS
在 PostgreSQL 6.3 中添加。
用法
CREATE TABLE AS
将根据提供的 SELECT
查询创建一个表。列名(除非使用 AS
显式修改)和数据类型将是 SELECT
查询生成的那些。请注意,不会创建任何约束或索引,如果需要,则需要手动添加。
与创建视图或物化视图相比,CREATE TABLE AS
会生成一个完全独立的表。
替代方案
CREATE TABLE ... (LIKE ...)
可用于“克隆”现有表的定义,但不能同时填充它。SELECT INTO
提供类似的功能,但CREATE TABLE AS
提供更多选项。
更改历史记录
- PostgreSQL 12
- PostgreSQL 9.5
- 添加了
IF NOT EXISTS
语法(提交 e39b6f95)
- 添加了
- PostgreSQL 9.1
- 添加了选项
UNLOGGED
(提交 53dbc27c)
- 添加了选项
- PostgreSQL 9.0
- PostgreSQL 8.4
- 添加了
WITH [ NO ] DATA
子句(提交 8ecd5351)
- 添加了
- PostgreSQL 8.2
- PostgreSQL 8.0
- 添加了选项
WITH
/WITHOUT OIDS
(提交 98dcf085)
- 添加了选项
- PostgreSQL 7.4
- 添加了
GLOBAL
子句(提交 ac5fdea6)
- 添加了
- PostgreSQL 7.2
- 添加了
LOCAL
子句(提交 bcb5aac8)
- 添加了
- PostgreSQL 6.3
- 添加(提交 2c833a72)
示例
CREATE TABLE AS 的基本用法示例
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=# CREATE TABLE bar AS SELECT * FROM foo WHERE id % 2 = 1; SELECT 50
创建的表将没有任何索引、约束或其他属性,即使它生成的查询只引用单个源表
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)
参考文献
- PostgreSQL 文档: CREATE TABLE AS