2013-07-15 23 views
3

我试图删除索引:执行唯一/主键 - DROP INDEX

DROP INDEX PK_CHARGES 

,但我得到这个错误

不能删除索引用于唯一/主键

执法

为什么我得到这个错误?如果您需要,我会提供更多信息。

如何解决?

编辑我在表上没有主键,但是我发现我不记得我加入了这个奇怪的指标:

指数名称= SYS_C0040476具有相同的列

+0

因为索引是用来强制执行一个主键(我猜,从名字中的PK),就像消息说的那样?你为什么试图放弃它? –

+0

您是否在使用索引来强制执行哪个唯一/主键?如果是这样,你发现了什么? – Oswald

+0

@AlexPoole我试图删除索引,我没有主键 – Moudiz

回答

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命令下探约束将其删除。

+0

这是正常的,我没有找到我的架构中的名称?我的意思是我有一个结果:所有者:不同的架构,常量名= pk_charges ....但在我的模式中,我没有找到我的约束名称 – Moudiz

+0

btw是所有类型都是P – Moudiz

+0

@Moudiz - 这取决于你的环境。如果您处于开发环境中,人们拥有自己的对象副本,那么这并不罕见;但在这种情况下,如果它属于其他人,你可能不应该首先放弃索引/约束。 –

1

“从PL/SQL我右击表”

与IDE的问题是,他们让我们感到非常有成效的,因为我们可以只用一个点击做的事情,而不是写一些码。这是一个问题,因为当发生不寻常的事情时,IDE不适合调查,我们缺乏对我们需要帮助自己的数据库底层结构的理解。

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

+0

APC它并不意味着如果我在桌上使用右键点击意味着我在'学习oracle',正如您所说的IDE的可以快速显示事情,我的问题和错误显示从代码和querries。你的评论是不恰当的,因为你不知道我的背景,所以你不能判断我 – Moudiz

+0

“如果你想学习[甲骨文]你可以做的最糟糕的事情是下载SQL Developer ......”等等。这是不正确的。 IDE为您提供了一个巨大的起点 - 从不了解任何事情到熟悉界面原则的指导,以帮助您掌握基本知识,直到您有机会充分理解为止。我相信你的评论看起来像你试图贬低谁开始与除编程基本文本编辑器以外的任何东西! – AdamCrawford

1

但我发现这个奇怪的指标,我不的rember我hadve问题补充

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

所以,当你放弃一个主键,你必须放弃该主键的唯一索引,这惊人地具有相同的名称与主键。

所以对于丢弃MY_TABLE_PK你必须做到:

ALTER TABLE MY_TABLE DROP PRIMARY KEY DROP INDEX; 

所以你确保索引也被丢弃。