admin

PostgreSQL:如果不存在AS,则创建表

sql

我正在使用PostgreSQL,并且是SQL的初学者。我正在尝试从查询创建表,并且如果运行:

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

它工作正常。但是然后如果我添加“如果不存在”并运行:

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

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

ERROR: syntax error at or near "as"

有什么办法吗?


阅读 137

收藏
2021-05-10

共1个答案

admin

CREATE TABLE AS被认为是与普通CREATE
TABLE
分开的语句,并且 直到Postgres版本9.5
(请参阅changelog条目)不支持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;
2021-05-10