【问题标题】:ORA-00955 "name is already used by an existing object"ORA-00955“名称已被现有对象使用”
【发布时间】:2015-08-05 20:13:24
【问题描述】:

我需要修改现有的 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");

一切正常。

【问题讨论】:

  • 发现这个问题有同样的错误。就我而言,这是出于尴尬的原因 - 我在从 SQL*Plus 调用的脚本中有一个 create index 命令,并且命令被 ; 终止,然后是下一行的 /。斜杠导致重复命令。我很傻,但希望有人能帮上忙。

标签: oracle oracle11g


【解决方案1】:

也许有一个INDEXPRIMARY KEY CONSTRAINT相关联,它也被命名为PK_B

您可以将其检查为:

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

如果这是真的,那么做:

ALTER INDEX "PK_B" RENAME TO "PK_XYZ";

更新:关于 ALTER INDEX 声明,贾斯汀在 cmets 中提到的几个要点

Oracle 隐式创建一个UNIQUE 索引以支持PRIMARY KEY CONSTRAINT。由于索引与主键同名,并且现在正在修改主键,因此 最好 删除并重新创建索引再次按照旧主键的定义。

我的结论:

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

Arup 的一个很好的演示和其他方面的详细说明:Primary Keys Guarantee Uniqueness? Think Again.

【讨论】:

  • 但请注意,如果存在与主键约束同名的索引,则可能意味着该索引是唯一的并且是为支持旧的主键约束而创建的。由于主键约束的定义正在更改,因此很有可能应该删除索引或将其重新创建为非唯一索引(取决于旧主键是什么)。
  • 完全同意贾斯汀。这让我想起了关于Do Primary Keys Guarantee Uniqueness?的几个讨论,因此,隐式创建了同名索引以保持唯一性并支持主键约束。我会编辑我的答案以添加这些要点。
【解决方案2】:

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多