2012-02-28 23 views
3

I持って次の列を持つOracleテーブル:Oracleの一意性制約 - 小文字混合

ID 
FUNCTION_ID 
FUNCTION_ROLE 

ID列が(シーケンス)ユニークですが、私はまた、両方の(FUNCTION_ID、FUNCTION_ROLE)の組み合わせもユニークになりたいです。

FUNCTION_ROLEは文字列であり、値が混在する場合することができ、すなわち、これを防ぐために最善のアプローチ何であるとして、私のクエリは、しかしです:

Data for this table: 
Row 1: 1,1,TEST1 
Row 2: 2,1,Test1 

私はユニークを得ることを期待します行2を 'Test1'として挿入しようとすると制約違反が発生するのは 'TEST1'と同じですが、大文字と小文字が異なるだけです。

これを回避するには、FUNCTION_ROLE_UPPERという別の列を作成し、FUNCTION_IDとともにこの列を使用して一意性をチェックする方法を考えてみましょう。これが正しいアプローチですか?

ありがとうございました。あなたは、この使用してファンクション索引を達成することができます

答えて

10

:Oracleの11アンダー

CREATE UNIQUE INDEX YOUR_TABLE_U1 ON YOUR_TABLE(FUNCTION_ID, UPPER(FUNCTION_ROLE)) 

を、あなたはまた、仮想列にUPPER(FUNCTION_ROLE)を置くことを検討することができます。

+0

ありがとう@Branko - 関数ベースのインデックス部分を理解していますが、仮想列のアスペクトを理解できませんか?あなたpls説明/例を提供できますか?ありがとう。 – tonyf

+1

@tonsils 'UPPER(FUNCTION_ROLE)'も名前を持っているという点を除いて、アイデアは基本的に同じですが、通常の列と同じようにクエリでき、_true_ UNIQUE制約を作成できます。それを参照してください(これは単なる一意索引では不可能です)。 –

+0

Gotcha - それに感謝します。 – tonyf