J'ai une table qui décrit une relation multi-to-one, disons entre Pictures et Albums. Je veux être en mesure de sélectionner une et une seule image par album comme image de couverture de l'album. En ce moment, la table est comme ceci:
AlbumID int primary key, PictureID int, IsCover bool
Supposons que je ne souhaite pas modifier le schéma global (une solution pourrait être de déplacer la relation "est la couverture de" vers une autre table, en définissant une relation un-à-un, mais il est préférable de ne pas modifier les requêtes déjà implémentées en ajoutant une autre table), existe-t-il un moyen de faire en sorte que toutes les inputs ayant le même AlbumID MAIS UN aient IsCover défini sur false?
Je suis à la search de solutions côté server. Je travaille avec Microsoft SQL Server 2012. La contrainte UNIQUE ne peut pas être appliquée ici, sinon je ne pourrais avoir qu'une couverture et une non-couverture pour chaque album. J'ai déjà mis en place une vérification dans mon application, mais j'aimerais vraiment avoir une couche supplémentaire de security.
Merci d'avance.
L'index filtré probablement unique est ce qui peut vous aider:
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)