あなたが最初のインデックスを作成する場合は、非ユニークなインデックスによってバックアップされているユニーク制約を持つことができます:それは最初にして指標として添加された可能性が高いと思われる名前が与えられ
create table t42 (id number);
Table T42 created.
create index per_index on t42(id);
Index PER_INDEX created.
alter table t42 add constraint per_unique unique (id);
Table T42 altered.
select index_name, uniqueness
from user_indexes where table_name = 'T42';
INDEX_NAME UNIQUENES
------------------------------ ---------
PER_INDEX NONUNIQUE
select constraint_name, constraint_type, status, deferrable, index_name
from user_constraints where table_name = 'T42';
CONSTRAINT_NAME C STATUS DEFERRABLE INDEX_NAME
------------------------------ - -------- -------------- ------------------------------
PER_UNIQUE U ENABLED NOT DEFERRABLE PER_INDEX
を後に制約が置かれました。
2つの手順でこれを行う理由の1つは、一意ではない既存のデータがあるが、すべての新しいデータを一意にすることが望ましい場合です。あなたは非一意のインデックスを作成し、novalidate
句で制約を追加することができます。新しい行が追加されると非ユニークインデックスがまだマッチングがすでにある場合はすぐに確認することができ
alter table t42 add constraint per_unique unique (id) novalidate;
エントリがある場合、制約は例外をスローできます。このチェックでは、インデックスが一意であるかどうかは関係ありません。唯一の実際の違いは、チェックで既存の一致が1つ以上取得される可能性がありますが、制約ではそれが非ゼロであると気になります。
また、ユニーク制約を遅延可能にすると、自動的に非一意索引が作成されます。そのチェックは延期することができないよう、一意のインデックスと例外がすぐにスローされます:あなたは2つの段階でそれらを作成する場合、制約はインデックスとして同じ名前を持つ必要がないこと
create table t42 (id number);
Table T42 created.
alter table t42 add constraint per_unique unique (id) deferrable;
Table T42 altered.
select index_name, uniqueness
from user_indexes where table_name = 'T42';
INDEX_NAME UNIQUENES
------------------------------ ---------
PER_UNIQUE NONUNIQUE
select constraint_name, constraint_type, status, deferrable, index_name
from user_constraints where table_name = 'T42';
CONSTRAINT_NAME C STATUS DEFERRABLE INDEX_NAME
------------------------------ - -------- -------------- ------------------------------
PER_UNIQUE U ENABLED DEFERRABLE PER_UNIQUE
注 - 制約を追加すると、制約が適用される列に一致するインデックスが使用されます。インデックスが自動的に作成されると、制約とインデックスは同じ名前になります。
は、あなたがそれを削除しない限り、その制約に違反するデータをロードすることはできませんが、それが理由で、おそらくそこだとして、軽く行うためのものではありません。なぜ制約が存在するのか、データがそれに違反する理由を理解する必要があります - そのうちの1つが間違っているかもしれませんが、あなたが本当にどれを決めるのを手助けすることはできません。それはビジネス上の決定だけでなく技術的なものでもあります。
テーブルの完全なDDL、または少なくともPER_INDEXの記述を投稿できますか? – Aleksej
ユニークでないインデックスがあるユニーク制約を持つことができます。あなたのテーブルに 'user_indexes'と' user_constraints'は何を表示しますか? –