事件回顾
清晨,业务同事急匆匆反馈:某张核心表突然无法更新和删除数据。追溯原因,发现昨日刚刚为该表新建了一个索引。难道“元凶”就是它?让我们抽丝剥茧,揭开谜底。

问题现象
表数据无法删除或更新
新建的索引也无法直接删除
排查思路
1. 索引状态检查
首先,查询索引的当前状态
SELECT * FROM dba_INDEXES WHERE OWNER='API_ODS' AND INDEX_NAME='PK_ODS_T_BB_SWTJB_LCB';
结果赫然显示:UNUSABLE —— 索引已不可用!
2. 查看索引创建语句
进一步查看索引的创建语句:

原来,索引在创建时就被设置成了 UNUSABLE,难怪表操作“卡壳”!
3. 尝试删除索引
尝试直接删除索引:
drop index API_ODS.PK_ODS_T_BB_SWTJB_LCB
错误报告 -
ORA-02429: 无法删除用于强制唯一/主键的索引
02429. 00000 - "cannot drop index used for enforcement of unique/primary key"
*Cause: user attempted to drop an index that is being used as the
enforcement mechanism for unique or primary key.
*Action: drop the constraint instead of the index.
发现该索引是主键索引

尝试删除的索引 API_ODS.PK_ODS_T_BB_SWTJB_LCB 是表上主键(PRIMARY KEY)或唯一约束(UNIQUE)的支撑索引。Oracle 不允许直接删除这种索引,因为它用于强制主键或唯一性约束
问题解决
重建该索引
ALTER INDEX API_ODS.PK_ODS_T_BB_SWTJB_LCB REBUILD;
查看索引状态

通知业务同事再次测试,确认表的更新和删除功能已全部恢复,问题圆满解决!
问题总结
主键或唯一约束的支撑索引不能直接删除,如需删除,必须先移除对应的约束。
索引为 UNUSABLE 时,优先考虑重建,操作高效且风险低。
删除主键/唯一约束及其索引的标准流程如下:
1. 先删除主键/唯一约束
你需要先删除主键或唯一约束,Oracle 会自动删除对应的索引。
查找主键约束名:
SELECT constraint_name
FROM dba_constraints
WHERE index_name = 'PK_ODS_T_BB_SWTJB_LCB'
AND owner = 'API_ODS';
查到的约束名为 PK_ODS_T_BB_SWTJB_LCB,则删除约束:
2、删除约束
ALTER TABLE ODS_T_BB_SWTJB_LCB DROP CONSTRAINT PK_ODS_T_BB_SWTJB_LCB;
3. 然后再删除索引(如果还存在)
通常删除约束后,Oracle 会自动删除该索引。如果没有自动删除,可以再执行:
DROP INDEX API_ODS.PK_ODS_T_BB_SWTJB_LCB;
遇到 Oracle 索引 UNUSABLE 导致表操作异常,切勿慌张!按照上述步骤有条不紊地排查和修复,轻松让业务“满血复活”。
最后修改时间:2025-04-29 09:34:38
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




