如何在不知道其名称的情况下删除唯一索引

时间:2020-08-23 16:53:33

标签: 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 个答案:

答案 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 $$

DEMO1

与函数/过程(取决于您的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