#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 $$
То же самое вы можете сделать с функцией / процедурой (зависит от вашей версии 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')