如何修复失效的主键索引?
ORACLE11204
--A、屡次收到这样的提单故障,ORA-01502,
--B、从名字上看,PK_HS_ACCTGPROCESSENTRY是个主键,故障应该是在对表做增删时,由于主键索引失效而引发这错误,,,但分析后,我有些糊涂,不明白如何把违反主键约束的数据插入表中,因为,假如索引未失效,唯一性有效,此时是无法把违反唯一性的数据插入库;假如索引已经失效,此时想插入这些数据,此时也会报错,因为索引无法使用,,,除非是插入时,忽略唯一性索引的校验,插入完后,再ENABLE 索引,结果报错,,,
--C、不过这不妨碍修复故障,下面是我在测试环境模拟修复该故障,
--1 使用sqlplus 工具,以该账号身份(上述故障中的CLOUDPRD),登录数据库。
--2 查看确认该索引的状态。
--3 备份数据,预防万一。
--4 删除主键关联的索引,然后查看该索引是否还存在?确认索引已经丢弃。
--5 查看表中的重复数据量。
--6 删除重复数据。
--7 修复索引。
--8 查看修复后的索引状态。
-D、下面是相关步骤的执行语句
--2
select status from user_indexes where index_name='PK_HS_ACCTGPROCESSENTRY';
--3
create table t_hs_acctgprocessentry_240603 as select * from t_hs_acctgprocessentry;
--4
alter table t_hs_acctgprocessentry disable primary key drop index;
--5
Select count(*) from
(select row_id, fprocessentryid, fordetbyseq, fseqentryid, seq from
(select rowid row_id, fprocessentryid,fordetbyseq,fseqentryid,
row_number() over(partition by fprocessentryid,fordetbyseq,fseqentryid order by rowid) seq from t_hs_acctgprocessentry) where seq>1);
--6
delete from t_hs_acctgprocessentry where rowid in
(select row_id from
(select row_id, fprocessentryid, fordetbyseq, fseqentryid, seq from
(select rowid row_id, fprocessentryid,fordetbyseq,fseqentryid,
row_number() over(partition by fprocessentryid,fordetbyseq,fseqentryid order by rowid) seq
from t_hs_acctgprocessentry) where seq>1) );
--7
alter table t_hs_acctgprocessentry enable primary key;
如何修复失效的主键索引?
本文2024-09-23 01:16:05发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-144858.html