2017-08-10 8 views
0

ある場合にのみ、私はこれと同様の構成、既存のSQL Serverのテーブルを持っている:SQL制約 - 値のユニークな組み合わせ別の列がnull

[Username] [Gateway] [Code] [ActiveTo] [OrgId] 
------------------------------------------------------ 
user1  gateway  50  Null  100 
user1  gateway  50  Null  101 
user2  gateway2  51  Null  102 
user3  gateway3  52  12/08/17  103 

このテーブルには、すでにユーザー名、ゲートウェイの重複組み合わせを持っていますコード。追加された新しいユーザーに[Username]、[Gateway]、[Code]の一意の組み合わせがありますが、上記の2つのuser1エントリなどの既存の2つの重複は無視されます(一致する新しいエントリは無視されません)既存のもの)。

しかし、私は重複の[ActiveTo]値がnullの場合にのみこれを適用したいと考えています(新規エントリのデフォルト値はActiveToです)。

したがって、上記の表に制約を適用すると、2つのuser1重複が無視されます。

[user2]、[gateway2]、[52]、[Null]、[104]の行を追加すると問題ありません。

[user2]、[gateway2]、[51]、[Null]、[105]の行を追加するとエラーが発生します。

しかし、行[user3]、[gateway3]、[52]、[Null]、[106]を追加すると問題ありません。

アイデア?

+0

を、私たちはテーブルを拡張することができていますか?制約はいつでも再適用可能でなければならないので、「一時的な」要件(既存の行)は、行を明示的にマークする新しい列としてモデル化するほうがよいでしょう。 OrgId、それが常に成長し、制約が適用されるときに使用する値がわかっている場合) –

答えて

1

あなたはユニークなインデックスを使用することができます

CREATE UNIQUE INDEX table_name_index_1 on table_name(Username, Gateway, Code) WHERE ActiveTo IS NOT NULL 
+0

OracleではなくSQL Serverに関して質問されています。 –

+1

私はオラクルでしか動作しないと思う。 SQL Serverでは、 'CASE'というキーワードの近くに誤った構文があります。 ' – Freddie93

+0

オブジェクト名 'Core.SFTPHost2HostConfig'と重複したキーが見つかったため、CREATE UNIQUE INDEXステートメントが終了しました(ユーザー名、ゲートウェイ、コード)WHERE ActiveTo IS NOT NULL –

関連する問題