Estoy trabajando en una función que me permite agregar un índice si no existe. Me encuentro con el problema que no puedo obtener una lista de índices para comparar. ¿Alguna idea?
Este es un problema similar al de creación de columnas que se resuelve con este código:
https://stackoverflow.com/a/12603892/368511
Respuestas:
Indice de nombres en PostgreSQL
Si no le importa el nombre del índice, haga que Postgres lo nombre automáticamente:
es (casi) lo mismo que:
Excepto que Postgres evitará una colisión de nombres y elegirá automáticamente el siguiente nombre gratis:
Solo inténtalo. Pero, obviamente, no querrá crear múltiples índices redundantes. Por lo tanto, no sería una buena idea crear a ciegas uno nuevo.
Prueba de existencia
Postgres 9.3 o anterior
Una forma muy simple de probar es emitir el nombre calificado para el esquema a
regclass
:Si arroja una excepción, el nombre es gratis.
O, para probar lo mismo sin lanzar una excepción, usado en una
DO
declaración:Esto no funciona
CREATE INDEX CONCURRENTLY
, ya que esa variante no se puede incluir en una transacción externa. Ver comentario de @Gregory a continuación.La
DO
declaración se introdujo con Postgres 9.0. En versiones anteriores, debe crear una función para hacer lo mismo.Detalles sobre
pg_class
en el manual .Conceptos básicos sobre los índices en el manual .
Postgres 9.4
Puede usar la nueva función
to_regclass()
para verificar sin lanzar una excepción:Devuelve NULL si no existe un índice (u otro objeto) de ese nombre. Ver:
Postgres 9.5
Ya disponible:
Eso también funciona para
CREATE INDEX CONCURRENTLY IF NOT EXISTS
.Sin embargo, el manual advierte :
Es una simple verificación del nombre del objeto. Se aplica a todas las variantes aquí.
fuente
CONCURRENTLY
esta manera. Lo conseguirásERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string
.Estará disponible en 9.5. Aquí está el git commit real https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
Discusión sobre pg hackers http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html
fuente