5

多対 1 の関係を説明するテーブルがあります。たとえば、Pictures と Albums の間です。アルバムのカバー画像として、アルバムごとに 1 つの画像のみを選択できるようにしたいと考えています。現在、テーブルは次のようになっています。

AlbumID int primary key,
PictureID int,
IsCover bool

スキーマ全体を変更したくないと仮定すると (解決策は、「is cover of」関係を別のテーブルに移動して、1 対 1 の関係を定義することですが、既に実装されているクエリを変更しないことをお勧めします別のテーブルを追加することによって)、同じ AlbumID を持つすべてのエントリの IsCover が false に設定されていることを強制する方法はありますか?

サーバー側のソリューションを探しています。私は Microsoft SQL Server 2012 を使用しています。ここでは UNIQUE 制約を適用できません。そうしないと、すべてのアルバムにカバーと非カバーしかありません。私はすでにアプリケーションにチェックを実装していますが、追加の安全層が必要です。

前もって感謝します。

4

1 に答える 1

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)
于 2013-10-29T12:10:04.623 に答える