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
