我正在使用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语句。不能使功能变长。
答案 0 :(得分:0)
尝试使用如下所示的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')