PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Tabelle erstellen, falls nicht vorhanden

Diese Funktion wurde in Postgres 9.1 implementiert :

CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);

Für ältere Versionen , hier ist eine Funktion, um das zu umgehen:

CREATE OR REPLACE FUNCTION create_mytable()
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   IF EXISTS (SELECT FROM pg_catalog.pg_tables 
              WHERE  schemaname = 'myschema'
              AND    tablename  = 'mytable') THEN
      RAISE NOTICE 'Table myschema.mytable already exists.';
   ELSE
      CREATE TABLE myschema.mytable (i integer);
   END IF;
END
$func$;

Aufruf:

SELECT create_mytable();        -- call as many times as you want. 

Hinweise:

  • Die Spalten schemaname und tablename in pg_tables sind zwischen Groß- und Kleinschreibung zu unterscheiden. Wenn Sie Bezeichner in CREATE TABLE in doppelte Anführungszeichen setzen Anweisung müssen Sie genau dieselbe Schreibweise verwenden. Wenn Sie dies nicht tun, müssen Sie Zeichenfolgen in Kleinbuchstaben verwenden. Siehe:

  • Wird bei PostgreSQL-Spaltennamen zwischen Groß- und Kleinschreibung unterschieden?

  • pg_tables enthält nur eigentliche Tabellen . Der Bezeichner darf noch durch zugehörige Objekte belegt sein. Siehe:

  • So überprüfen Sie, ob eine Tabelle in einem bestimmten Schema existiert

  • Wenn die Rolle Ausführen Diese Funktion verfügt nicht über die erforderlichen Berechtigungen zum Erstellen der Tabelle, die Sie möglicherweise mit SECURITY DEFINER verwenden möchten für die Funktion und machen Sie sie in Besitz durch eine andere Rolle mit den erforderlichen Rechten. Diese Version ist sicher genug.