执行唯一/主键 - 删除索引

时间:2013-07-15 07:18:15

标签: oracle primary-key unique-index

我正在尝试删除索引:

DROP INDEX PK_CHARGES

但我收到此错误

  

无法删除用于执行唯一/主键的索引

为什么我收到此错误?如果您需要,我会提供进一步的信息。

如何解决?

编辑我的表中没有主键,但我发现这个奇怪的索引,我不记得我添加了:

  

索引名称= SYS_C0040476,它们具有相同的列

4 个答案:

答案 0 :(得分:6)

您可以查询ALL_CONSTRAINTS performance view以查看索引所使用的约束以及它适用的表格,例如:

select owner, constraint_name, constraint_type,
    table_name, index_owner, index_name
from all_constraints
where index_name = 'PK_CHARGES';

我希望表名为'CHARGES',约束名称与索引名称匹配,约束类型为'P'。但是既然你有一张桌子,也许这些名字并没有遵循一个有用的约定。也许该表的旧版本已重命名,这会对新名称留下限制(例如CHARGES_BACKUP或其他内容)。


你说你点击表格,然后点击视图。也许您没有查看约束/索引所在的表;或者你可能正在查看实际表格上方的视图。您还在同一列上提到了SYS_索引 - 它们不能在同一个表中。您是否有多个类似的表,或访问多个模式?你也要对该索引运行上述查询。如上所述,您可能会找到该表的旧版本(或多个版本)。


一旦确定了约束所在的表,就需要确定是否应该保留它,如果不是,则可以通过使用ALTER TABLE命令删除约束来删除它。 / p>

答案 1 :(得分:3)

的问题
  

但我发现这个奇怪的索引,我不记得我已添加

是因为你没有添加它。您有一个主键,然后将其删除,但是当您这样做时,Oracle不会删除每个主键所具有的关联唯一索引。

因此,当您删除主键时,必须删除该主键的唯一索引,这与主键具有相同的名称。

因此,要删除MY_TABLE_PK,您必须执行以下操作:

ALTER TABLE MY_TABLE DROP PRIMARY KEY DROP INDEX;

这样你就可以确保索引也被删除了。

答案 2 :(得分:1)

  

“从pl / sql我右键点击表格”

IDE的问题在于它们让我们感觉非常高效,因为我们只需点击一下就可以做一些事情,而不是编写一些代码。这是一个问题,因为当发生异常事件时,IDE不利于调查,我们缺乏对数据库底层结构的理解,我们需要帮助自己。

如果您想学习Oracle数据库,您可以做的最糟糕的事情是下载SQL Developer或PLSQL Developer或TOAD。它们都是很好的工具,但是唯一应该使用它们的人是那些不需要使用它们的人。

答案 3 :(得分:0)

以下内容对我来说具有唯一索引:

ALTER INDEX UX_CHARGES UNUSABLE
/

DROP INDEX UX_CHARGES
/

请参阅:https://docs.oracle.com/cd/E18283_01/server.112/e17120/indexes004.htm#insertedID3