Estou trabalhando em uma função que me permite adicionar um índice se ele não existir. Estou enfrentando o problema que não consigo obter uma lista de índices para comparar. Alguma ideia?
Este é um problema semelhante ao da criação da coluna que é resolvido com este código:
https://stackoverflow.com/a/12603892/368511
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 nomenclatura e escolherá automaticamente o próximo nome livre:
Apenas tente. Mas, obviamente, você não gostaria de criar vários índices redundantes. Portanto, não seria uma boa ideia criar um novo às cegas.
Teste de existência
Postgres 9.5 ou mais recente
Agora disponível:
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 variantes para versões mais antigas abaixo também.)
Para encontrar índices existentes na mesma tabela para a(s) mesma(s) coluna(s):
Restrições:
WHERE
cláusula) e índices de cobertura (comINCLUDE
cláusula).Estude os resultados (se houver) antes de prosseguir ou refine a consulta de acordo com suas necessidades...
Leitura adicional:
Postgres 9.4
Você pode usar a nova função
to_regclass()
para verificar sem lançar uma exceção:Retorna NULL se um índice (ou outro objeto) com esse nome não existir. Ver:
Isso não funciona para
CREATE INDEX CONCURRENTLY
, pois essa variante não pode ser encapsulada em uma transação externa. Veja o comentário de @Gregory abaixo.Postgres 9.3 ou anterior
Transmita o nome qualificado pelo esquema para
regclass
:Se lançar uma exceção, o nome é livre.
Ou, para testar o mesmo sem lançar uma exceção, use uma
DO
instrução:A
DO
declaração foi introduzida com o 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 .
Estará disponível em 9.5. Aqui está o git commit real https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
Discussão sobre hackers pg http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html