it-swarm.com.de

PostgreSQL: Tabelle erstellen, falls AS nicht vorhanden ist

Ich verwende PostgreSQL und bin ein SQL-Anfänger. Ich versuche, eine Tabelle aus einer Abfrage zu erstellen.

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

es funktioniert gut. Aber dann, wenn ich 'Wenn nicht vorhanden' hinzufügen und ausführen:

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

mit genau derselben Abfrage bekomme ich:

ERROR: syntax error at or near "as"

Gibt es eine Möglichkeit, dies zu tun?

19
user3591836

CREATE TABLE AS wird als separate Anweisung von einer normalen CREATE TABLE und betrachtet, bis Postgres Version 9.5 (siehe changelog entry ) keine IF NOT EXISTS-Klausel unterstützt. (Sehen Sie sich unbedingt die richtige Version des Handbuchs für die von Ihnen verwendete Version an.)

Obwohl nicht ganz so flexibel, kann die CREATE TABLE ... LIKE-Syntax in manchen Situationen eine Alternative sein. Anstatt die Struktur (und den Inhalt) einer SELECT-Anweisung zu entnehmen, wird die Struktur einer anderen Tabelle oder Ansicht kopiert.

Folglich könnte man so etwas schreiben (ungeprüft); Die letzte Einfügung ist eine ziemlich unordentliche Möglichkeit, nichts zu tun, wenn die Tabelle bereits gefüllt ist:

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

Wenn Sie vorherige Daten löschen möchten (z. B. eine aufgegebene temporäre Tabelle), können Sie alternativ die alte Tabelle bedingt löschen und die neue Tabelle vorbehaltlos erstellen:

DROP TABLE IF EXISTS temp_stuff;

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

Wenn Sie eine Funktion dafür schreiben möchten, stützen Sie sich auf Systemkatalogtabelle pg_class , nicht auf Views im Informationsschema oder im Statistiksammler (die nur bei Aktivierung existieren).

CREATE OR REPLACE FUNCTION create_table_qry(_tbl text
                                          , _qry text
                                          , _schema text = NULL)
  RETURNS bool AS
$func$
DECLARE
  _sch text := COALESCE(_schema, current_schema());
BEGIN

IF EXISTS (
   SELECT 1 
   FROM   pg_catalog.pg_class c
   JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
   WHERE  n.nspname = _sch
   AND    c.relname = _tbl
   ) THEN

   RAISE NOTICE 'Name is not free: %.%',_sch, _tbl;
   RETURN  FALSE;
ELSE
EXECUTE format('CREATE TABLE %I.%I AS %s', _sch, _tbl, _qry);

   RAISE NOTICE 'Table created successfully: %.%',_sch, _tbl;
   RETURN  TRUE;
END IF;

END
$func$  LANGUAGE plpgsql;

Die Funktion verwendet einen Tabellennamen und eine Abfragezeichenfolge sowie optional ein Schema, in dem die Tabelle erstellt werden soll (standardmäßig aktuelles Schema ).

Beachten Sie die korrekte Verwendung von = im Funktionsheader und := im Funktionskörper:

Beachten Sie auch, wie Bezeichner als Bezeichner maskiert werden. Sie können regclass nicht verwenden, da die Tabelle noch nicht existiert:

4

Es ist einfach:

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

Versuche dies,

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.

Verwenden Sie do:

do $$ begin

if not exists (  SELECT 1
   FROM   information_schema.tables 
   WHERE  table_schema = 'schema_name'
   AND    table_name = 'bla ') then

  create table schema_name.bla as select * from blu;
end if;

end $$;

0
Stéphane Goyet