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

时间:2015-12-01 11:31:45

标签: oracle10g constraints primary-key ddl materialized-views

我创建了一个快速刷新的物化视图。它有一个我想要改变的主键(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位。

1 个答案:

答案 0 :(得分:1)

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

在你的情况下,删除约束PK_MV也不会删除它后面的索引,所以你仍然留下PK_MV索引。然后,稍后,当您尝试重新创建约束时,Oracle 坚持也为它创建一个索引,它只是不知道具有该名称的索引可能已经存在的可能性存在。

更糟糕的是,错误消息没有给出任何有关现有对象性质的提示,因此它会让您觉得现有对象是一个约束,因为那是您正在尝试的创建,而事实上现有的对象是一个你从未处理过的索引,没有用处,也可能不想知道任何事情。

啊,可爱的甲骨文啊。我对不得不使用它表示哀悼。

所以,请尝试以下方法:

alter table MV drop constraint PK_MV cascade;

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