Em um script MySQL, você pode escrever:
CREATE TABLE IF NOT EXISTS foo ...;
... outras coisas ...
e então você pode executar o script várias vezes sem recriar a tabela.
Como você faz isso no PostgreSQL?
fonte
Em um script MySQL, você pode escrever:
CREATE TABLE IF NOT EXISTS foo ...;
... outras coisas ...
e então você pode executar o script várias vezes sem recriar a tabela.
Como você faz isso no PostgreSQL?
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 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$ LANGUAGE plpgsql;
Ligar:
SELECT create_mytable(); -- call as many times as you want.
Notas:
As colunas schemaname
e tablename
in pg_tables
diferenciam maiúsculas de minúsculas. Se você CREATE TABLE
colocar aspas nos identificadores na declaração, precisará usar exatamente a mesma ortografia. Caso contrário, você precisará usar cadeias de letras minúsculas. Vejo:
pg_tables
contém apenas tabelas reais . O identificador ainda pode estar ocupado por objetos relacionados. Vejo:
Se a função que executa esta função não tiver os privilégios necessários para criar a tabela que você deseja usar SECURITY DEFINER
para a função e torná-la propriedade de outra função com os privilégios necessários. Esta versão é segura o suficiente.
CREATE FUNCTION
única vez. TalvezSELECT create_mytable();
você queira ligar várias vezes.Tente o seguinte:
fonte
IF NOT EXISTS
opção.Criei uma solução genérica a partir das respostas existentes que podem ser reutilizadas para qualquer tabela:
Uso:
Poderia ser simplificado ainda mais o uso de apenas um parâmetro se alguém extraísse o nome da tabela do parâmetro de consulta. Também deixei de fora os esquemas.
fonte
Essa solução é um pouco semelhante à resposta de Erwin Brandstetter, mas usa apenas a linguagem sql.
Nem todas as instalações do PostgreSQL possuem a linguagem plpqsql por padrão; isso significa que você pode precisar chamar
CREATE LANGUAGE plpgsql
antes de criar a função e depois remover a linguagem novamente, para deixar o banco de dados no mesmo estado em que estava antes (mas somente se o banco de dados não tinha o idioma plpgsql para começar). Veja como a complexidade cresce?Adicionar o plpgsql pode não ser um problema se você estiver executando seu script localmente; no entanto, se o script for usado para configurar o esquema em um cliente, pode não ser desejável deixar alterações como essa no banco de dados de clientes.
Esta solução é inspirada em um post de Andreas Scherbaum .
fonte
Não há CREATE TABLE SE NÃO EXISTE ... mas você pode escrever um procedimento simples para isso, algo como:
fonte
Não há CREATE TABLE SE NÃO EXISTE ... mas você pode escrever um procedimento simples para isso, algo como:
fonte