Ich arbeite an einer Funktion, mit der ich einen Index hinzufügen kann, wenn er nicht vorhanden ist. Ich habe das Problem, dass ich keine Liste der zu vergleichenden Indizes bekomme. Irgendwelche Gedanken?
Dies ist ein ähnliches Problem wie bei der Spaltenerstellung, das mit folgendem Code behoben wird:
https://stackoverflow.com/a/12603892/368511
Antworten:
Indexnamen in PostgreSQL
Wenn Sie sich nicht für den Namen des Indexes interessieren, lassen Sie Postgres diesen automatisch benennen:
ist (fast) dasselbe wie:
Mit der Ausnahme, dass Postgres Namenskollisionen vermeidet und automatisch den nächsten freien Namen auswählt:
Probier es einfach. Offensichtlich möchten Sie jedoch nicht mehrere redundante Indizes erstellen. Es wäre also keine gute Idee, einfach blindlings ein neues zu erstellen.
Auf Existenz prüfen
Postgres 9.3 oder älter
Eine sehr einfache Möglichkeit zum Testen besteht darin, den schemaqualifizierten Namen in Folgendes umzuwandeln
regclass
:Wenn es eine Ausnahme auslöst, ist der Name frei.
Oder, um dasselbe zu testen, ohne eine Ausnahme auszulösen, die in einer
DO
Anweisung verwendet wird:Dies funktioniert nicht
CREATE INDEX CONCURRENTLY
, da diese Variante nicht in eine äußere Transaktion eingebunden werden kann. Siehe Kommentar von @Gregory unten.Die
DO
Aussage wurde mit Postgres 9.0 eingeleitet. In früheren Versionen müssen Sie eine Funktion erstellen , um dasselbe zu tun.Details dazu
pg_class
im Handbuch .Grundlagen zu Indizes im Handbuch .
Postgres 9.4
Mit der neuen Funktion können Sie
to_regclass()
prüfen, ohne eine Ausnahme auszulösen:Gibt NULL zurück, wenn ein Index (oder ein anderes Objekt) dieses Namens nicht vorhanden ist. Sehen:
Postgres 9.5
Jetzt verfügbar:
Das funktioniert auch für
CREATE INDEX CONCURRENTLY IF NOT EXISTS
.Das Handbuch warnt jedoch :
Es ist eine einfache Überprüfung des Objektnamens. Gilt für alle Varianten hier.
quelle
CONCURRENTLY
diese Weise keine Indizes hinzufügen können. Du wirst bekommenERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string
.Es wird in 9.5 verfügbar sein. Hier ist das aktuelle Git-Commit https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
Diskussion zu PG-Hackern http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html
quelle