Pracuję nad funkcją, która pozwala mi dodać indeks, jeśli nie istnieje. Mam problem z tym, że nie mogę uzyskać listy indeksów do porównania. jakieś pomysły?
Jest to podobny problem do tworzenia kolumny, który został rozwiązany za pomocą tego kodu:
https://stackoverflow.com/a/12603892/368511
Odpowiedzi:
Nazwy indeksów w PostgreSQL
Jeśli nie obchodzi Cię nazwa indeksu, poproś o automatyczne nadanie mu nazwy Postgres:
jest (prawie) taki sam jak:
Tyle że Postgres uniknie kolizji nazw i automatycznie wybierze następną darmową nazwę:
Po prostu spróbuj. Ale oczywiście nie chcesz tworzyć wielu nadmiarowych indeksów. Więc nie byłoby dobrym pomysłem po prostu tworzenie na ślepo nowego.
Test na istnienie
Postgres 9.3 lub starszy
Bardzo prostym sposobem na przetestowanie jest rzutowanie nazwy kwalifikowanej do schematu na
regclass
:Jeśli zgłosi wyjątek, nazwa jest bezpłatna.
Lub, aby przetestować to samo bez zgłaszania wyjątku, użyte w
DO
instrukcji:To nie działa
CREATE INDEX CONCURRENTLY
, ponieważ ten wariant nie może być zawarty w zewnętrznej transakcji. Zobacz komentarz @Gregory poniżej.DO
Oświadczenie zostało wprowadzone z PostgreSQL 9.0. We wcześniejszych wersjach musisz utworzyć funkcję, aby zrobić to samo.Szczegóły na temat
pg_class
instrukcji .Podstawy indeksów w instrukcji .
Postgres 9.4
Możesz użyć nowej funkcji
to_regclass()
do sprawdzenia bez zgłaszania wyjątku:Zwraca NULL, jeśli indeks (lub inny obiekt) o tej nazwie nie istnieje. Widzieć:
Postgres 9.5
Już dostępny:
To też działa
CREATE INDEX CONCURRENTLY IF NOT EXISTS
.Jednak instrukcja ostrzega :
Jest to zwykłe sprawdzenie nazwy obiektu. Dotyczy wszystkich wariantów tutaj.
źródło
CONCURRENTLY
ten sposób. DostanieszERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string
.Będzie dostępny w wersji 9.5. Oto aktualny git commit https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
Dyskusja na temat hakerów pg http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html
źródło