从物化视图中删除主键但无法重新创建它 - 为什么?

Dropping primary key from a materialized view but unable to recreate it - why?

我创建了一个具有快速刷新功能的物化视图。它有一个我想更改的主键(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 版本为 Enterprise Edition Release 10.2.0.5.0 - 64 位。

Oracle 倾向于以一种奇怪的方式做某些事情,出于纯粹的恶意,导致奇怪的错误,并且使事情变得更糟,当错误发生时,它往往会给出从无用到完全误导的错误消息。

在您的情况下,删除约束 PK_MV 不会同时删除它后面的索引,因此您仍然留下 PK_MV 索引。然后,稍后,当您尝试重新创建约束时,Oracle 坚持 也为它创建一个索引,它只是无法忍受具有该名称的索引可能已经存在。

更糟糕的是,错误消息没有给您任何关于现有对象性质的提示,因此它给您留下现有对象是约束的印象,因为这就是您要创建的对象,而实际上现有对象是一个索引,您从未处理过,没有用处,并且可能不想知道任何相关信息。

啊,可爱的 Oracle。很抱歉不得不使用它。

所以,请尝试以下操作:

alter table MV drop constraint PK_MV cascade;

cascade 关键字将导致约束后面的索引也被删除。