PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL:Cria tabela se não existir AS


CREATE TABLE AS é considerado uma instrução separada de um CREATE TABLE normal e até a versão 9.5 do Postgres (veja a entrada do changelog) não suportava um IF NOT EXISTS cláusula. (Certifique-se de consultar a versão correta do manual para a versão que você está usando.)

Embora não seja tão flexível, o CREATE TABLE ... LIKE a sintaxe pode ser uma alternativa em algumas situações; em vez de pegar sua estrutura (e conteúdo) de um SELECT instrução, ele copia a estrutura de outra tabela ou visão.

Consequentemente, você poderia escrever algo assim (não testado); a inserção final é uma maneira bastante confusa de não fazer nada se a tabela já estiver preenchida:
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 );

Como alternativa, se você quiser descartar dados anteriores (por exemplo, uma tabela temporária abandonada), poderá descartar condicionalmente a tabela antiga e criar a nova incondicionalmente:
DROP TABLE IF EXISTS temp_stuff;

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