У мене є таблиця з такою компоновкою:
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, тому мені доведеться створити спеціальне меню "null" для кожного користувача, який є клопотом.Перевірте наявність нульового запису за допомогою тригера.
Я думаю, що це клопоту, і мені подобається уникати тригерів, де це можливо. Плюс, я не вірю їм, щоб гарантувати, що мої дані ніколи не знаходяться в поганому стані.Просто забудьте про це і перевірте наявність попереднього запису в середньому посуді або в функції вставки, і не мати цього обмеження.
Я використовую Postgres 9.0.
Чи є якийсь метод, який я не помічаю?
UserId
,RecipeId
), якщоMenuId IS NULL
?