5

我有一个描述多对一关系的表,比如图片和相册之间的关系。我希望能够为每个专辑选择一张且只有一张图片作为专辑的封面图片。现在,表格是这样的:

AlbumID int primary key,
PictureID int,
IsCover bool

假设我不想更改整体架构(解决方案可能是将“是覆盖”关系移动到另一个表,定义一对一关系,但最好不要更改已经实现的查询通过添加另一个表),有没有办法强制所有具有相同 AlbumID BUT ONE 的条目都将 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 回答