我正在尝试删除索引:
DROP INDEX PK_CHARGES
但我收到此错误
无法删除用于执行唯一/主键的索引
为什么我收到此错误?如果您需要,我会提供进一步的信息。
如何解决?
编辑我的表中没有主键,但我发现这个奇怪的索引,我不记得我添加了:
索引名称= SYS_C0040476,它们具有相同的列
答案 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