J'ai un tableau avec cette disposition:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Je veux créer une contrainte unique similaire à ceci:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Cependant, cela autorisera plusieurs lignes avec le même (UserId, RecipeId)
, si MenuId IS NULL
. Je veux permettre NULL
à MenuId
stocker un favori qui n'a pas de menu associé, mais je veux seulement au plus une de ces lignes par paire utilisateur / recette.
Les idées que j'ai jusqu'à présent sont les suivantes:
Utilisez des UUID codés en dur (tels que tous les zéros) au lieu de null.
Cependant,MenuId
a une contrainte FK sur les menus de chaque utilisateur, donc je devrais alors créer un menu spécial "nul" pour chaque utilisateur, ce qui est un problème.Vérifiez l'existence d'une entrée nulle en utilisant un déclencheur à la place.
Je pense que c'est un problème et j'aime éviter les déclencheurs dans la mesure du possible. De plus, je ne leur fais pas confiance pour garantir que mes données ne sont jamais en mauvais état.Oubliez-le et vérifiez l'existence précédente d'une entrée nulle dans le middleware ou dans une fonction d'insertion, et n'avez pas cette contrainte.
J'utilise Postgres 9.0.
Y a-t-il une méthode que j'oublie?
UserId
,RecipeId
), siMenuId IS NULL
?