Create unique constraint with null columns

У меня есть таблица с таким расположением:

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 для хранения любимого блюда, которое не имеет связанного меню, но я хочу иметь не более одной такой строки на пару пользователь/рецепт.

Идеи, которые у меня есть на данный момент:

  1. Использовать какой-нибудь жестко закодированный UUID (например, все нули) вместо null.
    MenuId имеет ограничение FK на меню каждого пользователя, поэтому мне придется создавать специальное "нулевое" меню для каждого пользователя, а это хлопотно.

  2. Вместо этого проверьте существование нулевой записи с помощью триггера.
    Я думаю, что это хлопотно, и мне нравится избегать триггеров, когда это возможно. К тому же, я не доверяю им в плане гарантии того, что мои данные никогда не будут в плохом состоянии.

  3. Просто забудьте об этом и проверяйте предыдущее существование нулевой записи в промежуточном ПО или в функции вставки, и не имейте этого ограничения.

Я использую Postgres 9.0.

Есть ли какой-нибудь метод, который я упускаю из виду?

219
задан Erwin Brandstetter 19 January 2013 в 16:44
поделиться