我正在使用PostgreSQL,我是SQL初学者.我试图从查询中创建一个表,如果我运行:

CREATE TABLE table_name AS
   (....query...)

它很好用.但如果我添加"如果不存在"并运行:

CREATE TABLE IF NOT EXISTS table_name AS
   (....query...)

使用完全相同的查询,我得到:

ERROR: syntax error at or near "as"

有什么办法吗?

推荐答案

CREATE TABLE AS被认为是与普通CREATE TABLE不同的单独声明,until Postgres version 9.5(见changelog entry)不支持IF NOT EXISTS条款.(请务必查看所用版本的正确手册版本.)

虽然没有那么灵活,但在某些情况下,CREATE TABLE ... LIKE语法可能是另一种 Select ;它不是从SELECT语句中获取其 struct (和内容),而是复制另一个表或视图的 struct .

因此,你可以写这样的东西(未经测试);如果表已经填充,那么最后的插入是一种相当混乱的无所事事的方式:

CREATE OR REPLACE VIEW source_data AS SELECT * FROM foo NATURAL JOIN bar;

CREATE TABLE IF NOT EXISTS snapshot LIKE source_data;

INSERT INTO snapshot
SELECT * FROM source_data
WHERE NOT EXISTS ( SELECT * FROM snapshot );

或者,如果要放弃以前的数据(例如,放弃的临时表),可以有条件地删除旧表,并无条件地创建新表:

DROP TABLE IF EXISTS temp_stuff;

CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar;

Postgresql相关问答推荐

尽管Jooq已经是uuid类型,Jooq仍会启用我的UID,为什么?

利用PostgreSQL查询中表的顺序来计算包含每次时间的时间范围

无法在PostgreSQL中创建方案和表

如何将存储的、生成的列添加到非常大的表中?

Pogresql性能中的枚举与文本数据类型

PL/pgSQL中的IP递增函数

PostGresql :正则表达式 Select 其中只有一个正斜杠的行

安装age-installation时出错

使用 WHERE 子句创建递归视图

是否可以短时间运行 VACUUM FULL 并获得一些好处?

PostgreSQL - 列出模式中的所有唯一约束

Postgres 转储按顺序插入

Postgresql:创建默认表空间的视图和使用?

我可以在 Ruby on Rails 上编写 PostgreSQL 函数吗?

在 postgres 中删除所有共享相同前缀的表

是否可以在 Postgres 中存储一个 1 字节的数字?

django.db.utils.IntegrityError:duplicate key value violates unique constraint "django_content_type_pkey"

从time without time zone和时区名称中获取time with time zone

Rails 验证数组中的值

在 Windows 7 上更改/重置 postgresql 用户密码