2017-12-14 14 views
1

にユニーク制約を追加します。どちらもnullではありません。私は2つの記録場所を挿入たとえばは、私は2つのフィールドが含まれているエンティティを持つ2つのNULLでないフィールド

organization = 1, ref = 'R1' 

organization = 1, ref = 'R1' 

これは、制約違反が発生しますが、これまでのところ、私はこのような場合には問題がありません。

そして、私は2つの記録場所を挿入したとき:

organization = null, ref = null 

organization = null, ref = null 

を。これは、これまでのところ、私はどちらか、この場合には問題がない、制約違反を生成しません。

私が持っている問題は、この場合には次のとおりです。

​​

それとも

organization = null, ref = 'R1' 

organization = null, ref = 'R1' 

この私はユニークにしたいので、両方のケースは、私はしたくないこれは、制約違反が発生していますorganizationrefの両方がnullでない場合に有効な制約。どのように私はこの問題を解決することができます

@Table(uniqueConstraints = { 
     @UniqueConstraint(columnNames = { "organization", "ref" }) 
}) 

これは私がユニーク制約を宣言した方法です。

PS:私はOracle 12cを使用しています。

編集:

  • 両方のフィールドorganizationrefはNULL可能です。私は宣言JPA

  • @UniqueConstraintアノテーションは、SQLコードを生成します:。

    はUNIQUE INDEX "USERNAMEを" CREATE "UK_TABLENAME_1" "USERNAME" ON "TABLENAME"( "組織"、 "REF")

+0

エンティティを変更することはできますか? – pirho

+0

@pirhoはいそれは –

+0

です。両方のフィールドで '@NotNull'と@Unique'の両方の制約を追加しないのはなぜでしょうか。 –

答えて

0

このために関数ベースのインデックスを作成する必要があります。

CREATE UNIQUE INDEX uidx_my_table ON my_table 
    (CASE WHEN organization IS NOT NULL AND ref IS NOT NULL 
     THEN organization || ref 
    END); 
+0

JPAを使ってこれを行う方法は私の質問はJPA 。 –

0

Oracleユニークインデックスについてかなり奇妙です:ユニークなインデックスを昇順

は、複数のNULL値を許可します。ただし、 の下位の一意のインデックスでは、複数のNULL値が重複値として として扱われるため、許可されません。

だから、あなたは一意のインデックスとこれを扱うことができますユニークな値がインデックスによって無視されるべきである

create unique index unq_t_organization_ref on t(organization, ref); 

+0

これは、JPAエンティティでdelcaredされた '@ UniqueConstraint'アノテーションで生成された同じクエリです。 –

関連する問題