据我所知,我无法通过研究stackoverflow和其他网站上的类似问题来直截了当。
但是,我需要这样做,我愿意采用变通方法。
我尝试使用online
和parallel
创建一个非唯一索引,然后删除旧的唯一索引。但是,它没有说ORA-01408: such column list already indexed
。
如何将唯一索引转换为非唯一索引?
答案 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);
请注意,不可见索引仍由数据库维护,您可以通过将其中一个变为不可见,将第二个变为可见来在它们之间进行更改。