PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL cria tabela se não existir


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 colunas schemaname e tablename em pg_tables diferenciam maiúsculas de minúsculas. Se você colocar aspas duplas em identificadores no CREATE 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 usar SECURITY 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.