我创建了一个快速刷新的物化视图。它有一个我想要改变的主键(using index
)。我在sqlplus
中运行了以下语句:
SQL> alter table
2 MV
3 drop constraint PK_MV;
Table altered.
SQL> alter table
2 MV
3 add constraint PK_MV primary key
4 (
5 A_ID
6 , B_ID
7 )
8 using index
9 tablespace IDX;
alter table
*
ERROR in line 1:
ORA-00955: name is already being used by existing object
似乎主键PK_MV
仍然存在。但是,第一个声明是不是放弃了?
Oracle版本是企业版10.2.0.5.0 - 64位。
答案 0 :(得分:1)
Oracle倾向于以奇怪的方式做某些事情,出于纯粹的恶意,导致奇怪的错误,并且更糟糕的是,当错误发生时,它往往会提供从无用到完全误导的错误消息。
在你的情况下,删除约束PK_MV也不会删除它后面的索引,所以你仍然留下PK_MV索引。然后,稍后,当您尝试重新创建约束时,Oracle 坚持也为它创建一个索引,它只是不知道具有该名称的索引可能已经存在的可能性存在。
更糟糕的是,错误消息没有给出任何有关现有对象性质的提示,因此它会让您觉得现有对象是一个约束,因为那是您正在尝试的创建,而事实上现有的对象是一个你从未处理过的索引,没有用处,也可能不想知道任何事情。
啊,可爱的甲骨文啊。我对不得不使用它表示哀悼。所以,请尝试以下方法:
alter table MV drop constraint PK_MV cascade;
cascade
关键字将导致约束后面的索引也被删除。