Как удалить уникальные индексы, не зная его имени

#postgresql

#postgresql

Вопрос:

Я использую PostgreSQL, и мне нужно удалить индекс, не зная его имени.

У меня есть несколько экземпляров, в которых index был создан с помощью Liquibase скрипта. Я хочу удалить созданные индексы и добавить новый индекс.

У меня есть скрипт, который выдаст мне Drop инструкции.

 select format('drop index %I.%I;', schemaname, indexname) as qry
from pg_indexes
where schemaname not in ('pg_catalog', 'pg_toast') 
and tablename='table_name' 
and indexname!='table_name_pkey'
  

Но я не уверен, как использовать результирующий набор для удаления inedexes.
Выполнение с использованием SQL Shell/ Liquibase где я могу добавлять инструкции SQL. Не могу создать длинные функции для этого.

Комментарии:

1. Как вы выполняете этот запрос?

2. Выполнение с использованием SQL Shell / Liquibase, где я могу добавлять инструкции SQL. Не могу создать длинные функции для этого.

3. PL / PGSQL может это сделать . (Возможно, потребуется DO блок ).

Ответ №1:

Попробуйте это с помощью блока DO, как показано ниже:

 do $$
declare
x text;
begin

x=(select string_agg(format('drop index %I.%I;', schemaname, indexname), ' ') as qry
from pg_indexes
where schemaname not in ('pg_catalog', 'pg_toast') 
and tablename='test' 
and indexname!='test_pkey');

execute x;
end $$
  

ДЕМО1

То же самое вы можете сделать с функцией / процедурой (зависит от вашей версии PostgreSQL), как показано ниже:

 create or replace function remove_index(table_name varchar, table_pkey varchar) returns void
as $$
declare
x text;
begin

x=(select string_agg(format('drop index %I.%I;', schemaname, indexname), ' ') as qry
from pg_indexes
where schemaname not in ('pg_catalog', 'pg_toast') 
and tablename=table_name
and indexname!=table_pkey);

execute x;

end;

$$
language plpgsql
  

и вызовите вышеуказанную функцию, как показано ниже:

 select * from remove_index('test','test_pkey')
  

DEMO2