Estou trabalhando em uma função que me permite adicionar um índice, se ele não existir. Estou com o problema que não consigo obter uma lista de índices para comparar. Alguma ideia?
Esse é um problema semelhante ao da criação da coluna resolvido com este código:
https://stackoverflow.com/a/12603892/368511
Respostas:
Nomes de índice no PostgreSQL
Se você não se importa com o nome do índice, faça com que o Postgres o nomeie automaticamente:
é (quase) o mesmo que:
Exceto que o Postgres evitará colisões de nomes e escolherá automaticamente o próximo nome gratuito:
Apenas tente. Mas, obviamente, você não gostaria de criar vários índices redundantes. Portanto, não seria uma boa ideia criar apenas uma nova cegamente.
Teste de existência
Postgres 9.3 ou anterior
Uma maneira muito simples de testar é converter o nome qualificado pelo esquema para
regclass
:Se lançar uma exceção, o nome estará livre.
Ou, para testar o mesmo sem gerar uma exceção, usado em uma
DO
instrução:Isso não funciona
CREATE INDEX CONCURRENTLY
, pois essa variante não pode ser quebrada em uma transação externa. Veja o comentário de @Gregory abaixo.A
DO
declaração foi introduzida no Postgres 9.0. Nas versões anteriores, você precisa criar uma função para fazer o mesmo.Detalhes sobre
pg_class
no manual .Noções básicas sobre índices no manual .
Postgres 9.4
Você pode usar a nova função
to_regclass()
para verificar sem gerar uma exceção:Retorna NULL se um índice (ou outro objeto) com esse nome não existir. Vejo:
Postgres 9.5
Agora disponível:
Isso também funciona para
CREATE INDEX CONCURRENTLY IF NOT EXISTS
.No entanto, o manual adverte :
É uma verificação simples para o nome do objeto. Aplica-se a todas as variantes aqui.
fonte
CONCURRENTLY
dessa maneira. Você vai conseguirERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string
.Ele estará disponível na 9.5. Aqui está o real git commit https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
Discussão sobre pg hackers http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html
fonte