Tengo una tabla con este diseño:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Quiero crear una restricción única similar a esta:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Sin embargo, esto permitirá múltiples filas con el mismo (UserId, RecipeId)
, si MenuId IS NULL
. Quiero permitir NULL
en MenuId
almacenar un favorito que se ha asociado ningún menú, pero yo sólo quiero lo sumo una de estas filas por par usuario / receta.
Las ideas que tengo hasta ahora son:
Use algún UUID codificado (como todos los ceros) en lugar de nulo.
Sin embargo,MenuId
tiene una restricción FK en los menús de cada usuario, por lo que tendría que crear un menú especial "nulo" para cada usuario, lo cual es una molestia.Verifique la existencia de una entrada nula utilizando un disparador en su lugar.
Creo que esto es una molestia y me gusta evitar los desencadenantes siempre que sea posible. Además, no confío en ellos para garantizar que mis datos nunca estén en mal estado.Solo olvídalo y verifica la existencia previa de una entrada nula en el middleware o en una función de inserción, y no tienes esta restricción.
Estoy usando Postgres 9.0.
¿Hay algún método que esté pasando por alto?
UserId
,RecipeId
), siMenuId IS NULL
?