Eu tenho uma tabela com este layout:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Quero criar uma restrição única semelhante a esta:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
No entanto, isso permitirá várias linhas com o mesmo (UserId, RecipeId)
, se MenuId IS NULL
. Quero permitir que NULL
em MenuId
armazenar um favorito que tem de menu não associado, mas eu só quero, no máximo, uma dessas linhas por par usuário / receita.
As idéias que tenho até agora são:
Use algum UUID codificado (como todos os zeros) em vez de nulo.
No entanto,MenuId
há uma restrição de FK nos menus de cada usuário, então eu teria que criar um menu "nulo" especial para cada usuário que seja um aborrecimento.Verifique a existência de uma entrada nula usando um gatilho.
Eu acho que isso é um aborrecimento e eu gosto de evitar gatilhos sempre que possível. Além disso, não confio neles para garantir que meus dados nunca estejam em mau estado.Apenas esqueça e verifique a existência anterior de uma entrada nula no middleware ou em uma função de inserção e não tenha essa restrição.
Estou usando o Postgres 9.0.
Existe algum método que estou ignorando?
UserId
,RecipeId
), seMenuId IS NULL
?