2013-06-18 79 views
1

任何人可以幫助我嗎?NOVALIDATE錯誤ORA-02299

id | Name 
-------- 
1 | aaa 
2 | bbb 
3 | aaa 

>alter table arc add CONSTRAINT uk_arc UNIQUE (NAME) novalidate 
error :ora-02299: cannot validate(.uk_arc) - duplicate keys found 

我使用novalidate忽略舊的重複,並開始再次驗證。

+1

可能的解釋[這裏](HTTP:/ /asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:8806498660292) – Noel

回答

6

如果我讓你正確,你還指望甲骨文忽略老重複值,並允許新的值時,才滿足約束。該錯誤將被返回,因爲當您添加約束時,Oracle會在該列上創建唯一索引以檢查值,但您的表已具有重複值,因此失敗。我會首先創建非唯一索引,然後添加約束,以便它使用您現有的非唯一索引,而不是自動生成這將失敗的唯一索引:

create index arc_ix on arc (name); 

alter table arc add constraint arc_uq unique (name) enable novalidate; 
+0

是我做,現在,但爲什麼它會工作在非唯一索引?你能解釋一下嗎? – Moudiz

+2

爲了保證'UNIQUE'約束所需的唯一性,Oracle需要索引,並且如果添加'UNIQUE'約束,默認情況下它會創建唯一索引。獨一無二的索引可以保證唯一性,這種'UNIQUE'約束是多餘的。所以在這種情況下'UNIQUE'約束更像是一種說明性的方式來說明存在一些約束。另一方面,非唯一索引允許重複(因此是名稱),並且可以用作'UNIQUE'約束作爲確定是否存在重複值的手段。在這種情況下,約束不是聲明式的。 –

相關問題