web-dev-qa-db-fra.com

PostgreSQL: Créer une table s'il n'existe pas AS

J'utilise PostgreSQL et je suis un débutant en SQL. J'essaie de créer une table à partir d'une requête et si je lance:

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

cela fonctionne très bien. Mais alors si j'ajoute 'sinon existant' et que je lance:

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

en utilisant exactement la même requête, je reçois:

ERROR: syntax error at or near "as"

Y a-t-il un moyen de faire ça?

19
user3591836

CREATE TABLE AS est considéré comme une instruction distincte d'un CREATE TABLE , et normal jusqu'à ce que Postgres version 9.5 (voir l'entrée de changelog ) ne prenne pas en charge une clause IF NOT EXISTS. (Veillez à consulter la version correcte du manuel correspondant à la version que vous utilisez.)

Bien que pas aussi souple, la syntaxe CREATE TABLE ... LIKE peut constituer une alternative dans certaines situations; Au lieu de prendre sa structure (et son contenu) dans une instruction SELECT, il copie la structure d'une autre table ou vue.

Par conséquent, vous pourriez écrire quelque chose comme ceci (non testé); l'insertion finale est une façon plutôt désordonnée de ne rien faire si la table est déjà remplie:

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

Sinon, si vous souhaitez supprimer les données précédentes (une table temporaire abandonnée, par exemple), vous pouvez supprimer conditionnellement l'ancienne table et créer sans conditions la nouvelle:

DROP TABLE IF EXISTS temp_stuff;

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

C'est simple:

 CREATE TABLE IF NOT EXISTS abc ( sql_id BIGINT(20) NOT NULL
   AUTO_INCREMENT PRIMARY KEY, sender VARCHAR(20) NULL)
0
Saquib Azam

Essaye ça,

create or replace function create_table(tblname text) returns text as
$$ 
BEGIN
$1 = trim($1);
IF not EXISTS (select relname from pg_stat_user_tables where relname =$1) THEN
execute 'create table '||$1||' as select * from tbl'; -- <put your query here>
return ''||$1||' Created Successfully !!';
else
return  ''||$1||' Already Exists !!';
END IF;
END
$$
language plpgsql 

create or replace function create_table_qry(tblname text,qry text) returns text as
$$ 
BEGIN
$1 = trim($1);
IF not EXISTS (select relname from pg_stat_user_tables where relname =$1) THEN
execute 'create table '||$1||' as '||$2||'';
return ''||$1||' Created Successfully !!';
else
return  ''||$1||' Already Exists !!';
END IF;
END
$$
language plpgsql 
0
Vivek S.