2016-10-13 8 views
1

私たちは、ワークフローが外部グループに情報を提出し、ユーザのID番号をシステムに入力するアプリケーションを持っています。私たちは、エントリの前に暫定値が承認され、永久的なものが中に入れられて、設定されたデフォルト値"00000000"は、idフィールドに入れることを可能にする。そのため1つの例外を除いてカラムをユニークにする

私が探している何が本質的ですその1つの値を除いて列がuniqueのままであることを保証する方法

基本的にはUNIQUEという制約がありますが、NULLの代わりに"00000000"という制約があります。私はCHECKという制約の一部としてそれをやっていると考えましたが、それは大きなパフォーマンスのヒットになるようです。 (UNIQUEは、索引作成のいくつかの種類を行うという仮定の下で)

+0

はnullを許可し、nullを不完全として扱います。チェック制約を使用するか、挿入トリガーの代わりに代わりに使用します(トリガーは嫌です) – Kritner

+0

フィルターされたインデックスを参照してください:http://stackoverflow.com/documentation/sql/344/indexes/23954 /部分またはフィルタリングされたインデックス#t = 20161013174245878339 – Horaciux

答えて

8

使用ろ過インデックス

次のように: -

CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notspecificvalue 
ON YourTable(yourcolumn) 
WHERE yourcolumn != "00000000"; 

例:

-- Create Table 
Create table Test (id int identity, code varchar (100)) 

-- Create Unique Filtered Index 
CREATE UNIQUE NONCLUSTERED INDEX idx_MyCol_Filtered 
ON Test(code) 
WHERE code != '00000000'; 

-- Insert Dumy Data >> '00000000' is repeated and '0101' is once 
insert into Test (code) 
Values ('00000000'), 
     ('00000000'), 
     ('00000000'), 
     ('0101') 


select * from Test 

結果:

enter image description here

-- Now try inserting '0101' again 
insert into Test (code) Values ('0101') 

結果:詳細については

enter image description here


:ワークフローを介してユーザのエントリを承認 Create Filtered Indexes

+0

これはまさに私が探していたものです。ありがとう! – adc90

+1

いつでも歓迎いたします。 –

0

非常に重要なビジネスロジックのように聞こえます。私はランダムであるがユニークな(タイムスタンプのような)番号を生成し、新しいユーザエントリで挿入することを提案したい。承認されたエントリーと承認されていないエントリーとを区別する(フラグを付ける)追加の列を保持する。ユーザーがワークフローから承認を受けると、IDとフラグを更新します。

関連する問題