Questa funzione è stata implementata in Postgres 9.1 :
CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);
Per versioni precedenti , ecco una funzione per aggirarlo:
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$;
Chiama:
SELECT create_mytable(); -- call as many times as you want.
Note:
-
Le colonne
schemaname
etablename
inpg_tables
fanno distinzione tra maiuscole e minuscole. Se virgolette gli identificatori inCREATE TABLE
dichiarazione, è necessario utilizzare la stessa identica ortografia. In caso contrario, è necessario utilizzare stringhe minuscole. Vedi: -
I nomi delle colonne di PostgreSQL fanno distinzione tra maiuscole e minuscole?
-
pg_tables
contiene solo tabelle effettive . L'identificatore può ancora essere occupato da oggetti correlati. Vedi: -
Come verificare se esiste una tabella in un determinato schema
-
Se il ruolo in esecuzione questa funzione non ha i privilegi necessari per creare la tabella che potresti voler usare
SECURITY DEFINER
per la funzione e rendila di proprietà da un altro ruolo con i privilegi necessari. Questa versione è abbastanza sicura.