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
undtablename
inpg_tables
sind zwischen Groß- und Kleinschreibung zu unterscheiden. Wenn Sie Bezeichner inCREATE 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.