Mam stół z tym układem:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Chcę utworzyć unikalne ograniczenie podobne do tego:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Pozwoli to jednak na wiele wierszy z tym samym (UserId, RecipeId)
, jeśli MenuId IS NULL
. Chcę pozwolić NULL
na MenuId
przechowywanie faworyta, który nie ma menu powiązanych, ale chcę tylko co najwyżej jeden z tych wierszy na parę użytkownik / receptury.
Dotychczasowe pomysły to:
Użyj jakiegoś zakodowanego UUID (takiego jak wszystkie zera) zamiast null.
JednakMenuId
ma ograniczenie FK w menu każdego użytkownika, więc musiałbym stworzyć specjalne menu „zerowe” dla każdego użytkownika, co jest kłopotliwe.Sprawdź, czy istnieje wpis zerowy, używając wyzwalacza.
Myślę, że to kłopot i lubię unikać wyzwalaczy tam, gdzie to możliwe. Ponadto nie ufam im, aby zagwarantować, że moje dane nigdy nie będą w złym stanie.Po prostu zapomnij o tym i sprawdź wcześniejsze istnienie pustego wpisu w oprogramowaniu pośrednim lub w funkcji wstawiania i nie masz tego ograniczenia.
Używam Postgres 9.0.
Czy przeoczyłem jakąś metodę?
UserId
,RecipeId
), jeśliMenuId IS NULL
?