九月 14, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的DROP INDEX语句删除现有索引。
目录
PostgreSQL DROP INDEX 语句简介
有时,您可能希望从数据库系统中删除现有索引。为此,您可以使用DROP INDEX语句,如下:
DROP INDEX  [ CONCURRENTLY]
[ IF EXISTS ]  index_name 
[ CASCADE | RESTRICT ];
在这个语法中:
index_name
您可以在DROP INDEX子句后指定要删除的索引的名称。
IF EXISTS
尝试删除不存在的索引将导致错误。为了避免这种情况,您可以使用IF EXISTS选项。如果您使用IF EXISTS删除不存在的索引,PostgreSQL 只会发出通知,而不是错误。
CASCADE
如果索引具有依赖对象,您可以使用CASCADE选项自动删除这些对象,以及依赖于这些对象的所有对象。
RESTRICT
如果有任何对象依赖于该索引,RESTRICT选项指示 PostgreSQL 拒绝删除该索引。DROP INDEX默认使用RESTRICT。
请注意,您可以通过用逗号 (,) 分隔索引名称来一次删除多个索引:
DROP INDEX index_name, index_name2,... ;
CONCURRENTLY
当您执行DROP INDEX语句时,PostgreSQL 会获取表上的独占锁并阻止其他访问,直到索引删除完成。
要强制DROP INDEX命令等待冲突事务完成后再删除索引,您可以使用CONCURRENTLY选项。
DROP INDEX CONCURRENTLY有一些限制:
- 首先,不支持CASCADE选项。
- 其次,也不支持在事务块中执行。
PostgreSQL DROP INDEX 示例
我们将使用示例数据库中的actor表进行演示。

以下语句为actor表的first_name列创建索引:
CREATE INDEX idx_actor_first_name 
ON actor (first_name);
有时,查询优化器不使用索引。例如,以下语句查找名为John的演员:
SELECT * FROM actor
WHERE first_name = 'John';
该查询没有使用之前定义的idx_actor_first_name索引,如以下EXPLAIN语句的结果中所述:
EXPLAIN SELECT *
FROM actor
WHERE first_name = 'John';

这是因为查询优化器认为扫描整个表来定位行是更优化的。因此,在这种情况下idx_actor_first_name没有用,我们需要将其删除:
DROP INDEX idx_actor_first_name;
该语句按预期删除了索引。
概括
- 使用 PostgreSQL 的DROP INDEX语句删除索引。