CREATE TABLE AS è considerata un'istruzione separata da una normale CREATE TABLE e fino alla versione 9.5 di Postgres (vedi voce del changelog) non supportava un IF NOT EXISTS
clausola. (Assicurati di guardare la versione corretta del manuale per la versione che stai utilizzando.)
Sebbene non sia altrettanto flessibile, CREATE TABLE ... LIKE
la sintassi potrebbe essere un'alternativa in alcune situazioni; piuttosto che prendere la sua struttura (e contenuto) da un SELECT
istruzione, copia la struttura di un'altra tabella o vista.
Di conseguenza, potresti scrivere qualcosa del genere (non testato); l'inserto finale è un modo piuttosto disordinato di non fare nulla se la tabella è già popolata:
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 );
In alternativa, se desideri eliminare i dati precedenti (ad es. una tabella temporanea abbandonata), puoi eliminare condizionalmente la vecchia tabella e creare incondizionatamente quella nuova:
DROP TABLE IF EXISTS temp_stuff;
CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar;