CREATE TABLE AS anses vara en separat sats från en vanlig CREATE TABLE, och tills Postgres version 9.5 (se ändringsloggposten) stödde inte en IF NOT EXISTS
klausul. (Se till att titta på rätt version av manualen för den version du använder.)
Även om det inte är lika flexibelt, är CREATE TABLE ... LIKE
syntax kan vara ett alternativ i vissa situationer; istället för att ta dess struktur (och innehåll) från en SELECT
uttalande, kopierar den strukturen för en annan tabell eller vy.
Följaktligen skulle du kunna skriva något sånt här (otestat); den sista infogningen är ett ganska rörigt sätt att inte göra någonting om tabellen redan är fylld:
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 );
Alternativt, om du vill kassera tidigare data (t.ex. en övergiven temporär tabell), kan du villkorligt släppa den gamla tabellen och ovillkorligen skapa den nya:
DROP TABLE IF EXISTS temp_stuff;
CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar;