J'ai une table 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 semblable à celle-ci :
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Cependant, cela permettra à plusieurs lignes avec le même nom d'utilisateur. (UserId, RecipeId)
si MenuId IS NULL
. Je veux permettre NULL
en MenuId
pour stocker un favori qui n'a pas de menu associé, mais je ne veux qu'un seul de ces rangs par couple utilisateur/préparation.
Les idées que j'ai jusqu'à présent sont :
-
Utilisez un UUID codé en dur (comme tous les zéros) au lieu de null.
Cependant,MenuId
a une contrainte FK sur les menus de chaque utilisateur, ce qui m'obligerait à créer un menu spécial "nul" pour chaque utilisateur, ce qui est fastidieux. -
Vérifier 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 autant que possible. De plus, je ne leur fais pas confiance pour garantir que mes données ne sont jamais dans un mauvais état. -
Il suffit de l'oublier et de vérifier l'existence préalable d'une entrée nulle dans le middle-ware ou dans une fonction d'insertion, et de ne pas avoir cette contrainte.
J'utilise Postgres 9.0.
Y a-t-il une méthode que je néglige ?
0 votes
Comment se fait-il que l'on autorise plusieurs lignes avec le même (
UserId
,RecipeId
), siMenuId IS NULL
?1 votes
@Drux Je crois que depuis
Null != Null
il s'ensuit que(userid, recipieid, null) != (userid, recipieid, null)
. Ainsi, les doublons seront autorisés qui nous semblent identiques, mais qui ne sont pas comparables à postgresql.