Esta función se ha implementado en Postgres 9.1 :
CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);
Para versiones anteriores , aquí hay una función para evitarlo:
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$;
Llamar:
SELECT create_mytable(); -- call as many times as you want.
Notas:
-
Las columnas
schemaname
ytablename
enpg_tables
distinguen entre mayúsculas y minúsculas. Si usa comillas dobles para los identificadores enCREATE TABLE
declaración, necesita usar exactamente la misma ortografía. Si no lo hace, necesita usar cadenas en minúsculas. Ver: -
¿Los nombres de las columnas de PostgreSQL distinguen entre mayúsculas y minúsculas?
-
pg_tables
solo contiene tablas reales . El identificador aún puede estar ocupado por objetos relacionados. Ver: -
Cómo verificar si existe una tabla en un esquema dado
-
Si el rol ejecutando esta función no tiene los privilegios necesarios para crear la tabla que tal vez quiera usar
SECURITY DEFINER
para la función y convertirla en propiedad por otro rol con los privilegios necesarios. Esta versión es lo suficientemente segura.