阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

136次阅读
没有评论

共计 1158 个字符,预计需要花费 3 分钟才能阅读完成。

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;

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-09/134962.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计1158字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中