2013-11-20 12 views
7

Setを想定しSQL Serverの条件付き固有のインデックス

PK | ClientID | SetID | Title 
----------------------------- 
P1 | C1  | S1 | Title1 
P2 | C1  | S1 | Title1 
P3 | C2  | S2 | Title1 
P4 | C2  | S2 | Title1 
P3 | C1  | S3 | Title2 
P5 | C1  | S3 | Title2 

Clientに属し、私は制約がタイトルを除いて、クライアント内で一意であること一意のインデックスを持つことができますそれは同じセット内の兄弟です。

したがって、例えば、私はTitle1を2つでは1つに2つではなくClientにすることができます。今度はClient1の場合、Title1という2番目のレコードを持っていますが、SetIDと他のレコードと同じものがある場合は、Titleとなります。

私はSQL Azureを使用していますが、より一般的には興味があります(2008 R2/2012など)。

編集:
テーブルの構造は変更できませんのでご注意ください。これはすでにこのように存在し、その背後には複雑なビジネス層があります。私はこれを修正することができれば、そうであれば偉大で、そうでなければ、壊れたままにすることができます。

+0

私はあなたの一意のインデックスを持ってしようとしているかを見ることができません重複した情報を持つことを可能にする3つの列。インデックスの一部になるために、たとえばID列を追加する場合にのみこれが修正できますが、テーブルを変更することはできません。 – gotqn

+0

私は列を追加することはできますが、テーブルを2つに分割するなどの変更を加えることはできません。 –

+0

@gotqn。ユニークなインデックスである必要はありません、それはちょうど私がトリックを行うだろうと思っている、ちょうど方法を考え出していない! :) –

答えて

2

追加の索引付けされたビューを試すことがあります。例えば

、テーブル:

create table dbo.Test (PK int, ClientID int, SetID int, Title varchar(50), primary key (PK)) 

insert into dbo.Test values 
    (1, 1, 1, 'Title1') 
    ,(2, 1, 1, 'Title1') 
    ,(3, 2, 2, 'Title1') 
    ,(4, 2, 2, 'Title1') 
    ,(5, 1, 3, 'Title2') 
    ,(6, 1, 3, 'Title2') 

ビューおよびインデックス:

その後
create view dbo.vTest 
with schemabinding 
as 
    select ClientID, Title, SetID, cnt=count_big(*) 
    from dbo.Test 
    group by ClientID, Title, SetID 
GO 
create unique clustered index UX_vTest on dbo.vTest (ClientID, Title) 
GO 

insert into dbo.Test values (7, 1, 1, 'Title1') -- will pass 
insert into dbo.Test values (8, 1, 1, 'Title1') -- will pass 
insert into dbo.Test values (9, 1, 2, 'Title1') -- will fail 
insert into dbo.Test values (10, 2, 2, 'Title1') -- will pass 
insert into dbo.Test values (11, 1, 3, 'Title1') -- will fail 
+0

これは私が一番考慮しているルートです。御時間ありがとうございます。 –

0

私は右の質問を得た場合、私は挿入/更新トリガその上で追加について1:1関係を持っているSetIDTitleの間でリンクし、ClientID and SetID

方法
CREATE UNIQUE INDEX [Index_Name] 
ON [dbo].[MyTable]([ClientID ], [SetID]) 
+0

アドバイスをいただきありがとうございます。残念ながら私は構造を変更するオプションがありません。私のオプションは次のとおりです:列を追加(計算?)、インデックス、ビューなどを追加します。 –

0

に一意のインデックスを追加するために、別のテーブルを追加しますチェックが実行され、ルール違反が発生した場合にフェイル例外が発生します。 データモデルを変更せずにこれらを追加できます。

+0

私はこれを考慮しましたが、少し汚れているようです。私は実際にBEFORE INSERTが必要な目的のためにAFTER INSERT DMLトリガを使用しています。これを行うためのトリガを使用することで私の懸念は、パフォーマンスです。長所と短所を提供できますか? –

+0

トリガーを使用できる場合は、挿入を処理してチェックを行うための 'INSTEAD OF INSERT'トリガーを作成することができます。 – gotqn

+0

@gotgnありがとう、私はそれを認識していますが、INSTEAD OFトリガでは、挿入されたものを書き直す必要があります。私は 'INSERT INTO [table] SELECT * FROM INSERTED'を行うことができれば幸せですが、私はそれをIDで行うことはできません。 –