У меня есть таблица с этим макетом:
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 (например, все нули) вместо нуля.
ТемMenuId
не менее, имеет ограничения FK для меню каждого пользователя, поэтому мне пришлось бы создать специальное «нулевое» меню для каждого пользователя, что создает трудности.Проверьте наличие нулевой записи, используя вместо этого триггер.
Я думаю, что это хлопот, и мне нравится избегать триггеров, где это возможно. Кроме того, я не доверяю им, чтобы гарантировать, что мои данные никогда не будут в плохом состоянии.Просто забудьте об этом и проверьте наличие ранее нулевой записи в промежуточном программном обеспечении или в функции вставки, и у вас нет этого ограничения.
Я использую Postgres 9.0.
Есть ли какой-то метод, который я пропускаю?
UserId
,RecipeId
), еслиMenuId IS NULL
?