任何人可以幫助我嗎?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忽略舊的重複,並開始再次驗證。
任何人可以幫助我嗎?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忽略舊的重複,並開始再次驗證。
如果我讓你正確,你還指望甲骨文忽略老重複值,並允許新的值時,才滿足約束。該錯誤將被返回,因爲當您添加約束時,Oracle會在該列上創建唯一索引以檢查值,但您的表已具有重複值,因此失敗。我會首先創建非唯一索引,然後添加約束,以便它使用您現有的非唯一索引,而不是自動生成這將失敗的唯一索引:
create index arc_ix on arc (name);
alter table arc add constraint arc_uq unique (name) enable novalidate;
是我做,現在,但爲什麼它會工作在非唯一索引?你能解釋一下嗎? – Moudiz
爲了保證'UNIQUE'約束所需的唯一性,Oracle需要索引,並且如果添加'UNIQUE'約束,默認情況下它會創建唯一索引。獨一無二的索引可以保證唯一性,這種'UNIQUE'約束是多餘的。所以在這種情況下'UNIQUE'約束更像是一種說明性的方式來說明存在一些約束。另一方面,非唯一索引允許重複(因此是名稱),並且可以用作'UNIQUE'約束作爲確定是否存在重複值的手段。在這種情況下,約束不是聲明式的。 –
可能的解釋[這裏](HTTP:/ /asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:8806498660292) – Noel