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