ORA-00955“名称已被现有对象使用”

时间:2014-09-23 11:04:36

标签: oracle oracle11g

我需要修改现有的PK。因此我放弃重新创建它。

ALTER TABLE B DROP CONSTRAINT PK_B;
ALTER TABLE B ADD CONSTRAINT PK_B PRIMARY KEY ("TYP", "NR", "HH", "QUART");

不幸的是,最后一个声明会给我一个错误ORA-00955

如果我创建PK约束,就像它最初定义的那样:

ALTER TABLE B ADD CONSTRAINT PK_B PRIMARY KEY ("TYP", "NR", "HH");

一切正常。

2 个答案:

答案 0 :(得分:15)

也许INDEXPRIMARY KEY CONSTRAINT相关联,并且它也被命名为PK_B

您可以将其检查为:

SELECT * FROM USER_INDEXES WHERE TABLE_NAME='<table_name>';

如果那是真的,那么就做:

ALTER INDEX "PK_B" RENAME TO "PK_XYZ";

更新:关于ALTER INDEX声明,Justin在评论中提到的几点重要

Oracle隐式创建UNIQUE索引以支持PRIMARY KEY CONSTRAINT。因为,索引与主键的名称相同,并且现在主键正在被修改,所以 更好 可以删除并重新创建索引再次按照旧主键的定义。

我的结论:

  • 主键约束通过唯一索引强制执行。
  • 如果Oracle已经找到索引 - 唯一或非唯一 - 它会使用它 对于主键。
  • 如果索引最初创建为非唯一,则会继续 显示为非唯一,但实际上它将是一个唯一索引。

Arup:Primary Keys Guarantee Uniqueness? Think Again.

是一个很好的演示,其他方面也非常详细

答案 1 :(得分:0)

我遇到了同样的问题,我必须执行以下操作,从头开始重新创建数据库,从视图中删除对表的引用。我首先在表和索引中搜索相同的内容。

connect sys/oracle as sysdba;
select * from all_tables
select * from all_indexes
(finally located the reference in the views)
select * from all_views where view_name like '%WKSTSTATE%';
drop view RUEGEN.WKSTSTATE;