PostgreSQL 删除索引
本文介绍在 PostgreSQL 中如何使用 DROP INDEX
从一个表中删除现有的索引。
在 PostgreSQL 中,您可以使用 DROP INDEX
从一个表中删除现有的索引。
PostgreSQL DROP INDEX
语法
有时,您可能希望从数据库系统中删除现有索引。为此,您可以使用以下 DROP INDEX
语句:
DROP INDEX [ CONCURRENTLY ]
[ IF EXISTS ] name
[ CASCADE | RESTRICT ];
说明:
-
name
是要删除的索引的名称。 -
IF EXISTS
指示如果指定的索引不存在将不会给出错误, PostgreSQL 将会发出一个通知。 -
CASCADE
指示 PostgreSQL 自动删除那些依赖于此索引的对象。 -
RESTRICT
指示如果有其他对象依赖于此索引,则拒绝删除。 这是默认的行为。 -
删除索引时, PostgreSQL 默认会获取该表的排他锁并阻止任何其他的访问,知道索引删除完成。您可以使用
CONCURRENTLY
选项改变这一行为。注意,当使用
CASCADE
选项时, 不支持CONCURRENTLY
。
一个简单的删除索引的语句如下:
DROP INDEX name;
您可以使用一个语句同时删除多个索引,如下:
DROP INDEX name1, name2,... ;
PostgreSQL DROP INDEX
实例
我们将使用 PostgreSQL Sakila 示例数据库中的 actor
表进行演示。
以下语句为 actor
表的 first_name
列创建索引:
CREATE INDEX idx_actor_first_name
ON actor (first_name);
有时,查询优化器不使用索引。例如,以下语句查找名为 John
的 actor:
SELECT * FROM actor
WHERE first_name = 'John';
该查询未使用 idx_actor_first_name
之前定义的索引,如以下 EXPLAIN
语句中所述:
EXPLAIN
SELECT * FROM actor
WHERE first_name = 'John';
QUERY PLAN
------------------------------------------------------
Seq Scan on actor (cost=0.00..4.50 rows=1 width=25)
Filter: ((first_name)::text = 'John'::text)
这是因为查询优化器认为只扫描整个表来定位行更为优化。因此,在这种情况下没有用 idx_actor_first_name
,我们需要删除它:
DROP INDEX idx_actor_first_name;
结论
在 PostgreSQL 中,您可以使用 DROP INDEX
从一个表中删除现有的索引。