Oracle数据库,将唯一索引转换为非唯一索引

时间:2012-08-16 00:31:47

标签: oracle

据我所知,我无法通过研究stackoverflow和其他网站上的类似问题来直截了当。

但是,我需要这样做,我愿意采用变通方法。

我尝试使用onlineparallel创建一个非唯一索引,然后删除旧的唯一索引。但是,它没有说ORA-01408: such column list already indexed

如何将唯一索引转换为非唯一索引?

2 个答案:

答案 0 :(得分:5)

如果您不想在创建新索引之前删除旧索引,则可以通过使用其他无用列创建新索引来作弊,例如:

假设一个表具有以下配置:

create table mytable (id number);

create unique index myunique on mytable (id);

将索引转换为非唯一:

create index temp on mytable (id, 1);

drop index myunique;

create index mynonunique on mytable (id);

drop index temp;

在实践中,我不确定这是多么必要 - 通常我会在一些低活动期间丢弃并重新创建索引,最好是关闭应用程序。

答案 1 :(得分:0)

Oracle 现在支持应用于同一组列的多个索引,只要它们的唯一性不同(和/或一些其他属性,例如位图与 btree 和分区)和 只要其中一个可见。

因此,您可以更改现有索引 - 将其更改为不可见而不删除它,然后创建一个新的非唯一索引。

CREATE TABLE mytable (id NUMBER);

CREATE UNIQUE INDEX mytable_unique_idx ON mytable(id);

ALTER INDEX mytable_unique_idx INVISIBLE;

CREATE INDEX mytable_nonunique_idx ON mytable(id);

请注意,不可见索引仍由数据库维护,您可以通过将其中一个变为不可见,将第二个变为可见来在它们之间进行更改。