普通索引转HASH分区索引报ORA-01408

       ORA-01408:such column list already indexed问题的原因是当新建一个索引时,索引对应的字段和字段顺序和已经存在的索引相同。
       最近一个需求,是将主键索引转成HASH分区的主键索引,需要新建一个索引,然后将现有的主键索引去掉。如果直接新建一个字段相同且字段顺序相同的索引,就会报ORA-01408。当然,可以将现有的主键索引先删掉,但这样在新索引建立之前,无法保证数据的唯一性,并且按主键的更新删除操作会因为无索引而变的很慢。
       我们可以通过建一个中间索引,来保证新建索引前数据的唯一性及按索引更新删除操作的性能。

以下测试:
db:oracle 11.2.0.4

#新建测试表
--DROP TABLE SCOTT.TB_SJ01;
CREATE TABLE SCOTT.TB_SJ01
AS SELECT * FROM DBA_OBJECTS WHERE OBJECT_ID IS NOT NULL;

#为测试表增加主键索引
ALTER TABLE SCOTT.TB_SJ01 ADD CONSTRAINT PK_TB_SJ01 PRIMARY KEY (OBJECT_ID);

#如果直接新建一个索引,报ORA-01408
CREATE UNIQUE INDEX SCOTT.IDX_TB_SJ01 ON SCOTT.TB_SJ01(OBJECT_ID)
GLOBAL PARTITION BY HASH(OBJECT_ID) PARTITIONS 8 ONLINE;
/*
ORA-01408:such column list already indexed
*/

#先新建一个中间索引
CREATE UNIQUE INDEX SCOTT.IDX_TB_SJ01 ON SCOTT.TB_SJ01(OBJECT_ID,1) ONLINE;

#删除原有的主键索引
ALTER TABLE SCOTT.TB_SJ01 DROP CONSTRAINT PK_TB_SJ01 CASCADE;

#新建HASH分区的唯一索引
CREATE UNIQUE INDEX SCOTT.PK_TB_SJ01 ON SCOTT.TB_SJ01(OBJECT_ID)
GLOBAL PARTITION BY HASH(OBJECT_ID) PARTITIONS 8 ONLINE;

#添加新的主键
ALTER TABLE SCOTT.TB_SJ01 ADD CONSTRAINT PK_TB_SJ01 PRIMARY KEY (OBJECT_ID) USING INDEX ;

#删除中间索引
DROP INDEX SCOTT.IDX_TB_SJ01;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28539951/viewspace-2124378/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28539951/viewspace-2124378/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值