У меня есть таблица с таким расположением:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Я хочу создать уникальное ограничение, подобное этому:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Однако это позволит нескольким строкам с одинаковыми (UserId, RecipeId)
, если MenuId IS NULL
. Я хочу разрешить NULL
в MenuId
для хранения любимого блюда, которое не имеет связанного меню, но я хочу иметь не более одной такой строки на пару пользователь/рецепт.
Идеи, которые у меня есть на данный момент:
Использовать какой-нибудь жестко закодированный UUID (например, все нули) вместо null.
MenuId
имеет ограничение FK на меню каждого пользователя, поэтому мне придется создавать специальное "нулевое" меню для каждого пользователя, а это хлопотно.
Вместо этого проверьте существование нулевой записи с помощью триггера.
Я думаю, что это хлопотно, и мне нравится избегать триггеров, когда это возможно. К тому же, я не доверяю им в плане гарантии того, что мои данные никогда не будут в плохом состоянии.
Просто забудьте об этом и проверяйте предыдущее существование нулевой записи в промежуточном ПО или в функции вставки, и не имейте этого ограничения.
Я использую Postgres 9.0.
Есть ли какой-нибудь метод, который я упускаю из виду?