2013-07-15 26 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; 

所以你確保索引也被丟棄。