无法删除带Schema名称的分区表索引问题求助
解决分区表索引无法删除的问题
问题原因
你创建索引时用双引号包裹了movies.actors_2010_name_idx作为完整索引名,PostgreSQL会将包含点字符的整个字符串当作索引名(而非movies模式下名为actors_2010_name_idx的索引)。而删除语句未加引号时,PostgreSQL会自动把movies.actors_2010_name_idx解析为movies模式下的actors_2010_name_idx索引,自然匹配不到实际存在的索引。
解决步骤
1. 确认索引的真实信息
执行以下SQL查询,定位索引的实际名称和所在模式:
SELECT ns.nspname AS 索引所在模式, idx.relname AS 索引名称, tbl.relname AS 关联表名 FROM pg_class idx JOIN pg_index i ON idx.oid = i.indexrelid JOIN pg_class tbl ON i.indrelid = tbl.oid LEFT JOIN pg_namespace ns ON idx.relnamespace = ns.oid WHERE tbl.relname = 'actors_2010';
2. 使用正确语句删除索引
根据查询结果选择对应操作:
- 若索引名称确实是
movies.actors_2010_name_idx(包含点),用双引号包裹完整索引名执行删除:DROP INDEX IF EXISTS "movies.actors_2010_name_idx"; - 若索引位于
movies模式下、名称为actors_2010_name_idx(属于创建语句引号使用错误),直接指定模式删除:DROP INDEX IF EXISTS movies.actors_2010_name_idx;
3. 处理并发创建失败的异常
如果索引是通过CONCURRENTLY创建的,可能因中途中断处于无效状态,此时用并发删除语句处理:
DROP INDEX CONCURRENTLY IF EXISTS "movies.actors_2010_name_idx";
内容的提问来源于stack exchange,提问作者Dileep
相关产品推荐
相关产品推荐

