2017-03-03 6 views
0

colAとcolBの2つの列にUNIQUE制約を設定したいとします。制約は、それが、コーラおよびCOLBの値の組み合わせが一意であることを確認します設定されると互換性のない値を持つ複数の列に対するUNIQUE制約

また、例えば、テーブル内の行に対して

は、コーラ値が100であれば、ことを確認してください& colBの値が101の場合、colAの値は101にできません。colBの値は、そのテーブルの他の行については100にできません。

お勧めします。

よろしく、 サチン

+0

'' cola''が常に 'colB'よりも小さいことを(' CHECK'によって)強制することは許されますか? –

+0

いいえ、colAが常にcolB未満になることはありません。 table内の任意のIDに対して、colAとcolBの値を交換することはできません。それ以上の説明が必要な場合はお知らせください。 CHECK制約のあるソリューションは受け入れられるはずですが。 –

答えて

1

Checkunique index

create table uni(colA number, colB number); 

    ALTER TABLE uni ADD CONSTRAINT constraint_name check(cola != colb); 

    create unique index uni_idx on uni( LEAST(cola , colb),GREATEST(cola , colb)); 

insert into uni values (100,101); (OK) 
into uni values (100,102); (OK) 
into uni values (101,100); (error) 
into uni values (100,100); (error) 
+0

はい、あなたは正しいです、私はインデックスから '||'を削除することを忘れます –

+0

WHERE句でこのインデックスの妥当性をどのようにチェックしますか?私は、SELECT * FROM uniどこから(cola、colb)= GREATEST(cola、colb)?またはこのような他のコード化? –

+0

しかし、なぜそれをチェックしたいですか?挿入を行い、2つの例外( 'ORA-02290、ORA-00001')を扱います。 –