从物化视图中删除主键但无法重新创建它 - 为什么?
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
关键字将导致约束后面的索引也被删除。
我创建了一个具有快速刷新功能的物化视图。它有一个我想更改的主键(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
关键字将导致约束后面的索引也被删除。