6

我知道我不能通过研究 stackoverflow 和其他网站上的类似问题来直接做到这一点。

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

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

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

4

2 回答 2

8

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

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

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;

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

于 2012-08-16T01:32:18.987 回答
1

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);

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

于 2021-01-19T07:55:28.563 回答