PostgreSQL:创建表如果不存在AS

我使用Postgresqlsql初学者.我正在尝试从查询创建一个表,如果我运行:
CREATE TABLE table_name AS
   (....query...)

它的工作很好.但是如果我添加“如果不存在”并运行:

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

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

06002

有没有办法做到这一点?

CREATE TABLE AS被视为与正常 CREATE TABLE的单独声明,直到Postgres 9.5版(见 changelog entry)不支持IF NOT EXISTS子句. (请务必查看正在使用的版本的手册的正确版本.)

虽然不太灵活,但在某些情况下,CREATE TABLE … LIKE语法可能是另一种选择;而不是从SELECT语句中获取其结构(和内容),它会复制另一个表或视图的结构.

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

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;

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1. 标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1. 数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1. 表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4. 从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1. 读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三种独立的实现模式匹...