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?
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;
C'est simple:
CREATE TABLE IF NOT EXISTS abc ( sql_id BIGINT(20) NOT NULL
AUTO_INCREMENT PRIMARY KEY, sender VARCHAR(20) NULL)
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