Je travaille sur une fonction qui me permet d'ajouter un index s'il n'existe pas. Je rencontre un problème auquel je ne parviens pas à obtenir une liste d’index à comparer. Des pensées?
Ceci est un problème similaire à celui de la création de colonne qui est résolu avec ce code:
https://stackoverflow.com/a/12603892/368511
Réponses:
Noms d'index dans PostgreSQL
Si vous ne vous souciez pas du nom de l'index, demandez à Postgres de le nommer automatiquement:
est (presque) identique à:
Sauf que Postgres évitera les conflits de noms et choisira automatiquement le nom suivant libre:
Juste l'essayer. Mais, évidemment, vous ne voudriez pas créer plusieurs index redondants. Donc, ce ne serait pas une bonne idée de créer aveuglément un nouveau.
Test d'existence
Postgres 9.3 ou plus ancien
Un moyen très simple de tester consiste à convertir le nom qualifié du schéma en
regclass
:S'il lève une exception, le nom est libre.
Ou, pour tester le même sans lever une exception, utilisé dans une
DO
déclaration:Cela ne fonctionne pas
CREATE INDEX CONCURRENTLY
car cette variante ne peut pas être encapsulée dans une transaction externe. Voir le commentaire de @Gregory ci-dessous.La
DO
déclaration a été introduite avec Postgres 9.0. Dans les versions antérieures, vous devez créer une fonction pour faire de même.Détails sur
pg_class
dans le manuel .Notions de base sur les index dans le manuel .
Postgres 9.4
Vous pouvez utiliser la nouvelle fonction
to_regclass()
pour vérifier sans lever d’exception:Renvoie NULL si un index (ou un autre objet) portant ce nom n'existe pas. Voir:
Postgres 9.5
Maintenant disponible:
Cela fonctionne aussi pour
CREATE INDEX CONCURRENTLY IF NOT EXISTS
.Cependant, le manuel met en garde :
C'est un contrôle simple du nom de l'objet. S'applique à toutes les variantes ici.
la source
CONCURRENTLY
cette façon. Vous aurezERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string
.Il sera disponible dans 9.5. Voici la commande git actuelle https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
Discussion sur les hackers pg http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html
la source