У меня есть таблица с этим макетом:
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.
Есть ли какой-нибудь метод, который я пропускаю?