Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PostgreSQL: Create table if not exists AS

I'm using PostgreSQL and am an SQL beginner. I'm trying to create a table from a query, and if I run:

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

it works just fine. But then if I add 'if not exists' and run:

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

using exactly the same query, I get:

ERROR: syntax error at or near "as" 

Is there any way to do this?

like image 645
user3591836 Avatar asked Sep 17 '14 17:09

user3591836


People also ask

What does <> mean in PostgreSQL?

<> is the standard SQL operator meaning "not equal". Many databases, including postgresql, supports != as a synonym for <> . They're exactly the same in postgresql.

How do I create a global temporary table in PostgreSQL?

The temporary table must be created by each session that uses it and the lifetime of the rows are either commit or session based exactly like it is with the GTT. PostgreSQL has also an additional clause ON COMMIT DROP that automatically drops the temporary table at the end of a transaction.


1 Answers

CREATE TABLE AS is considered a separate statement from a normal CREATE TABLE, and until Postgres version 9.5 (see changelog entry) didn't support an IF NOT EXISTS clause. (Be sure to look at the correct version of the manual for the version you are using.)

Although not quite as flexible, the CREATE TABLE ... LIKE syntax might be an alternative in some situations; rather than taking its structure (and content) from a SELECT statement, it copies the structure of another table or view.

Consequently, you could write something like this (untested); the final insert is a rather messy way of doing nothing if the table is already populated:

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 ); 

Alternatively, if you want to discard previous data (e.g. an abandoned temporary table), you could conditionally drop the old table, and unconditionally create the new one:

DROP TABLE IF EXISTS temp_stuff;  CREATE TEMPORARY TABLE temp_stuff AS SELECT * FROM foo NATURAL JOIN bar; 
like image 64
IMSoP Avatar answered Sep 21 '22 14:09

IMSoP