pgsql 删除创建索引,如何删除Postgres中表的所有索引?

在 PostgreSQL 中,如果你需要为测试目的删除多个索引,可以使用 DO 语句结合动态 SQL 来实现。这个方法不会影响到由约束(如 UNIQUE, PK, EXCLUDE)创建的内部索引。提供的 SQL 代码示例展示了一个可以循环删除指定表上所有索引的方法,避免手动操作的繁琐。
摘要由CSDN通过智能技术生成

I keep having this problem: I have like 20 indexes on a table that I need to drop in order to do testing. Dropping the table doesn't drop all of this metadata.

There doesn't seem to be a wildcard drop index ix_table_* or any useful command. There seem to be some bash loops around psql you can write.

There must be something better! Thoughts?

解决方案

Assuming you only want to drop plain indexes:

DO

$$BEGIN

EXECUTE (

SELECT 'DROP INDEX ' || string_agg(indexrelid::regclass::text, ', ')

FROM pg_index i

LEFT JOIN pg_depend d ON d.objid = i.indexrelid

AND d.deptype = 'i'

WHERE i.indrelid = 'your_table_name_here'::regclass -- possibly schema-qualified

AND d.objid IS NULL -- no internal dependency

);

END$$;

Does not touch indexes created as implementation detail of constraints (UNIQUE, PK, EXCLUDE).

The documentation:

DEPENDENCY_INTERNAL (i)

The dependent object was created as part of creation of the referenced

object, and is really just a part of its internal implementation.

You could wrap this in a function for repeated execution.

Related:

Aside: This is a misunderstanding:

Dropping the table doesn't drop all of this metadata.

Dropping a table always cascades to all indexes on the table.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值