Я работаю над функцией, которая позволяет мне добавить индекс, если он не существует. Я столкнулся с проблемой, что я не могу получить список индексов для сравнения. есть идеи?
Эта проблема аналогична проблеме создания столбца, которая решается с помощью следующего кода:
https://stackoverflow.com/a/12603892/368511
Ответы:
Индексные имена в PostgreSQL
Если вас не интересует имя индекса, попросите Postgres автоматически назвать его:
это (почти) так же, как:
За исключением того, что Postgres избежит конфликтов имен и автоматически выберет следующее свободное имя:
Просто попробуйте. Но, очевидно, вы не захотите создавать несколько избыточных индексов. Так что было бы неплохо просто слепо создать новый.
Тест на существование
Postgres 9.3 или старше
Очень простой способ проверить это привести приведенное к схеме имя к
regclass
:Если выдается исключение, имя является бесплатным.
Или, чтобы проверить то же самое без исключения, используется в
DO
выражении:Это не работает
CREATE INDEX CONCURRENTLY
, так как этот вариант не может быть включен во внешнюю транзакцию. Смотрите комментарий @Gregory ниже.DO
Заявление было введено с Postgres 9.0. В более ранних версиях вы должны создать функцию, чтобы сделать то же самое.Подробности
pg_class
в руководстве .Основы об указателях в руководстве .
Postgres 9,4
Вы можете использовать новую функцию
to_regclass()
для проверки без исключения:Возвращает NULL, если индекс (или другой объект) с таким именем не существует. Видеть:
Postgres 9,5
Теперь доступно:
Это также работает для
CREATE INDEX CONCURRENTLY IF NOT EXISTS
.Тем не менее, руководство предупреждает :
Это простая проверка имени объекта. Относится ко всем вариантам здесь.
источник
CONCURRENTLY
таким образом. Вы получитеERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string
.Будет доступно в 9.5. Вот фактический git commit https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
Обсуждение pg-хакеров http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html
источник