Den här funktionen har implementerats i Postgres 9.1 :
CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);
För äldre versioner , här är en funktion för att komma runt det:
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$;
Ring:
SELECT create_mytable(); -- call as many times as you want.
Anmärkningar:
-
Kolumnerna
schemaname
ochtablename
ipg_tables
är skiftlägeskänsliga. Om du dubbelciterar identifierare iCREATE TABLE
påstående måste du använda exakt samma stavning. Om du inte gör det måste du använda strängar med små bokstäver. Se: -
Är PostgreSQL-kolumnnamn skiftlägeskänsliga?
-
pg_tables
innehåller bara faktiska tabeller . Identifieraren kan fortfarande vara upptagen av relaterade objekt. Se: -
Hur man kontrollerar om en tabell finns i ett givet schema
-
Om rollen kör den här funktionen har inte de nödvändiga rättigheterna för att skapa tabellen som du kanske vill använda
SECURITY DEFINER
för funktionen och gör den ägd av en annan roll med nödvändiga privilegier. Den här versionen är tillräckligt säker.