2013-10-29 12 views
5

私は多対1の関係を記述するテーブルを持っています。ピクチャとアルバムの間にあるとしましょう。私はアルバムのカバー画像として1枚のアルバムにつき1枚しか選択できないようにしたいと考えています。今、表には、このようなものです:ブール値の列(一種のラジオボタン)で「一意性」を適用する方法は?

AlbumID int primary key, 
PictureID int, 
IsCover bool 

は、私は、全体のスキーマを変更したくないと仮定すると(溶液が定義する、別のテーブルとの関係「のカバーである」移動する可能性がありワン他のテーブルを追加して既に実装されているクエリを変更しないことが望ましい)、同じアルバムIDを持つすべてのエントリがIsCoverをfalseに設定するよう強制する方法はありますか?

私はサーバー側のソリューションを探しています。私はMicrosoft SQL Server 2012で作業しています。UNIQUE制約はここでは適用できません。そうでなければ、すべてのアルバムに対してカバーと非カバーのみを持つことができます。私はすでに自分のアプリケーションで小切手を実装していますが、私は本当に安全性のレイヤーを追加したいと思っています。

ありがとうございます。

+2

新しいエントリがカバーアイテムであることを想定しているかどうかをチェックして、他のすべてをマークし、挿入後/更新後トリガーを使用してはどう関連エントリはfalse? –

+1

CHECK制約を使用すると、テーブルで好きなルールを適用できます。実際のチェックを行い、制約内で使用する関数を作成します。 –

+0

両方のおかげで!しかし、私は可能な限りシンプルなものを保つために、ユニーク制約に似たものがあるかどうかを調べようとしています。 – Simone

答えて

4

おそらくユニークなフィルターのインデックスはあなたを助けるかもしれないものです。

create table AlbumPics (
    AlbumID int not NULL, 
    PictureID int not NULL, 
    IsCover bit not NULL, 
    primary key clustered (AlbumID, PictureID) 
) 

create unique index UX_AlbumPics_CoverPic 
    on AlbumPics (AlbumID) where IsCover = 1 

-- insert 3 pics for album 1, one of them is cover pic 
insert into AlbumPics values 
(1, 1, 0), (1, 2, 1), (1, 3, 0) 

-- try to insert one more cover for album 1 - will fail 
insert into AlbumPics values 
(1, 4, 1) 
+1

+1ですが、 "Filtered Indexes"はSQL Server 2008以降です。 http://technet.microsoft.com/en-us/library/cc280372.aspx –

+0

ありがとうi-one、これはまさに私が探していた解決策です!ただ一つのこと:アルバムのカバーが常にあることをどうすれば保証できますか?上記のコードは1つしかないことを確認しますが、存在しない可能性があります。 – Simone

+1

@Simoneでは、 'CoverPictureID int not NULL'カラムを' Albums'テーブルに追加するだけでなく、すべてのアルバムにカバーするようにする確実な方法があるかどうかはわかりません。 「アルバム」テーブルのスキーマを変更できない場合は、特殊画像「カバーなし」を選択する、アルバムの表紙がない場合や、ダーティなデータ "のアルバム。 –

関連する問題