Este recurso foi implementado no Postgres 9.1 :
CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);
Para versões mais antigas , aqui está uma função para contornar isso:
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$;
Ligar:
SELECT create_mytable(); -- call as many times as you want.
Notas:
-
As colunasschemaname
etablename
empg_tables
diferenciam maiúsculas de minúsculas. Se você colocar aspas duplas em identificadores noCREATE TABLE
declaração, você precisa usar exatamente a mesma ortografia. Caso contrário, você precisa usar strings em minúsculas. Ver:
-
Os nomes das colunas do PostgreSQL fazem distinção entre maiúsculas e minúsculas?
-
pg_tables
contém apenas tabelas reais . O identificador ainda pode ser ocupado por objetos relacionados. Ver:
-
Como verificar se uma tabela existe em um determinado esquema
-
Se a função executando esta função não tem os privilégios necessários para criar a tabela que você pode querer usarSECURITY DEFINER
para a função e torná-la propriedade por outra função com os privilégios necessários. Esta versão é segura o suficiente.