2016-08-23 3 views
0

私が見ているテーブルには、ユニークな制約と、複数のカラムにわたるユニークなインデックスと、両方のカラムが全く同じカラムがあります。ユニークインデックスとユニーク制約(マルチカラム)はなぜですか?

これには用途がありますか、ユニークな制約が重複していますか?

+2

ユニーク制約はインデックスでバックアップする必要があります。それは*固有のものではありません。両方を持つのは正常です。彼らは通常、同じ名前を持っていますが、それは必ずしもそうではありません。もちろん、明示的な一意性制約なしに一意のインデックスを持つことができます。しかし、この制約によって、これはパフォーマンスだけでなく完全性のためであることが明らかになりました(Oracleおよび開発者にとって)。なぜこれが問題だと思いますか? –

+1

アレックスと同意するが、そこに何かが重複していると見なされた場合は、インデックスの一意性を選択すると付け加える。私はむしろ制約とユニークなインデックスよりもユニークでないインデックスとユニークではないインデックスを持っています。 –

+0

MSDNの記事https://technet.microsoft.com/en-us/library/aa224827(v=sql.80).aspxによると、ユニークな制約とユニークなインデックスの間には実用的な違いはありません。制約は、データベース内の制約オブジェクトとしてもリストされます。一意の制約を無効にすることはできないため、制約の状態を持つことで一意の制約を超えて一意の制約が追加されることはありません。ただし、一意制約を作成するALTER TABLEコマンドでは使用できない索引作成オプションがいくつかあります。記事 – Gopidoss

答えて

1

一意のインデックスのユニークインデックスの存在が最初は冗長に見えることに同意します。混乱しないように、あなた自身を繰り返さないという違反のようです。しかし、管理機能と既存の複製を許可する少なくとも2つの理由が存在します。

管理は、理論的には

機能、論理的な制約は、実装を気にせずに作成することができます。制約は、コミットまで制約を延期するなど、いくつかのオプションとともに真でなければならないことを指定します。

実際には、制約には実装が考慮されなければならないほど大きなパフォーマンスとストレージのペナルティがあります。インデックスが必要です。そうしないと、O(log(n))の代わりにO(n)の時間が必要になります。それらの索引は膨大な量の領域を占めることがあります。誰かが格納されている場所、圧縮方法などを指定することができます。

ほとんどの場合、これらの機能は重要ではなく、すべてのインデックスの既定値を使用するのが大丈夫です。しかし、ストレージとパフォーマンスが重要な場合もあり、制約を気にすることなくインデックスを調整したい人もいます。

ユニーク制約が一意のインデックスを持っていない少なくとも一つのケースがあり

重複を既存の許可。既存の重複した値を許可することはできますが、制約をNOVALIDATEに設定し、一意でないインデックスを使用することで、将来の重複を防ぐことができます。

--Create table and insert duplicate values. 
create table test1(a number); 

insert into test1 values(1); 
insert into test1 values(1); 
commit; 

--Add a non-validated unique constraint, with a non-unique index. 
alter table test1 
add constraint test1_uq unique(a) 
using index (create /* Not unique!*/ index test1_uq on test1(a)) novalidate; 

--Now multiple inserts raise: ORA-00001: unique constraint (JHELLER.TEST1_UQ) violated 
insert into test1 values(2); 
insert into test1 values(2); 

物理インデックスは重複を許可する必要がありますが、論理制約は重複を許可しないことが分かります。これはまれな機能ですが、実動コードで見たことがあるかどうかはわかりません。

+1

一意制約を遅延可能として追加すると、一意でないインデックスも自動的に作成されます。 –

関連する問題