2012-03-20 7 views
4

に応じて、複数列の制約を作成:column1 == someValue場合は、私は次のように述べているOracleデータベース上の制約を作成しようとしている列の値

、その後column2column3の組み合わせが持つすべてのエントリに対して一意である必要がありますcolumn1 == someValue

私はユニーク制約とチェック制約の概念に精通しており、これらの構造で制約を表現しようとしました。しかし、私は条件を含める方法を見つけることができないようです。だからこそ私はそれが可能なのか疑問に思います。

次のクラス階層をマッピングするHibernateが作成されるために、私は制約を作成するテーブル(簡潔にするためommited属性のほとんど):

class MyClass { 
    String name; 
    MyClass parent; 
} 

class MySubClass extends MyClass { 
    String businessValue; 
} 

は、クラスが単一のテーブルの戦略を使用して、さまざまな使用してマッピングされています各タイプの識別器の値。 MySubClassのすべてのインスタンスに対して、名前と親の組み合わせが一意でなければならないという顧客の要件です(column1は弁別子の値になります)。テーブル制約を介して、親クラスにそのような制約を適用するのは簡単でしょう。ただし、この制約はMySubClassにのみ適用する必要があります。

Hibernate Validatorなどのフレームワークを使用してデータをデータベースに入力する前に、そのデータを検証する可能性があります。しかし、検証にはデータベースへのアクセスが必要になるため、データベースの制約はパフォーマンスを向上させる方法のようです。

+1

ORM開発者がデータベースの制約を使用するメリットを享受していることを非常にうれしく思います! –

答えて

5

あなたは制約でこれを行うことはできませんが、このよう"function-based index"(FBI)を使用して、それを行うことができます。

create unique index mytable_idx on mytable 
    (case when column1 = 'somevalue' then column2 end 
    , case when column1 = 'somevalue' then column3 end 
    ); 

これが唯一のカラム1 =「someValueの」が行のためのユニークなインデックス・エントリを作成し、他の行には重複が含まれている可能性があります

+0

これらのケースが完了していないか、何か不足していますか? –

+0

@Florin、ありがとう - 最近、私の答えの特徴になっています:-( –

+0

+1 nice contraintのテクニック –

関連する問題