2016-05-10 8 views
-1

私のデータウェアハウスでは、カラム(ID,IDATE,NAME,GENERATION,O_ID,NODE_ID)にユニークキーTABLE_UKのテーブルがあり、カラムにのユニークでないインデックスPER_INDEXがあります。一意でないインデックスを持つときに一意制約違反

ソーステーブルからデータをロードするには、私はエラーが発生します中:

ORA-00001: unique constraint (PER_INDEX) violated

を私はユニークな列を確認したが何の重複はありません。

一意でないインデックスでこの一意制約違反エラーが発生するのはなぜですか?

また、ターゲット表にデータをロードするには、この索引を削除する必要がありますか、それとも他の方法がありますか?

+1

テーブルの完全なDDL、または少なくともPER_INDEXの記述を投稿できますか? – Aleksej

+0

ユニークでないインデックスがあるユニーク制約を持つことができます。あなたのテーブルに 'user_indexes'と' user_constraints'は何を表示しますか? –

答えて

1

あなたが最初のインデックスを作成する場合は、非ユニークなインデックスによってバックアップされているユニーク制約を持つことができます:それは最初にして指標として添加された可能性が高いと思われる名前が与えられ

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つが間違っているかもしれませんが、あなたが本当にどれを決めるのを手助けすることはできません。それはビジネス上の決定だけでなく技術的なものでもあります。

+0

これは、ユニークでないインデックスがテーブルのユニークな制約として機能することを意味しますか?索引 'PER_INDEX'は一意性が一意ではなく、通常のタイプです。 – priya77

+0

@ priya77 - 制約は一意でないインデックスyesを使用します。私はそれがフードの下で何をしているのかよく分かりませんが、インデックスにすぐに制約に違反する値があるかどうかを知ることができると思います。その目的のために、索引自体が一意であるかどうかは重要ではありません。 –

+0

私のインデックスはパフォーマンス目的のために作成されました。次のようにソーステーブルをチェックしました: ID、NAME、GENERATION、STRUCTURE_AREA、カウントを持つO_IDによってtarget_tableグループからcount(*)、ID、NAME、GENERATION、STRUCTURE_AREA、O_IDを選択してください(*)> 1; このクエリは、 – priya77

関連する問題