このレイアウトのテーブルがあります:
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
にしたいのですが、ユーザー/レシピのペアごとにこれらの行を最大で 1 つだけ保存したいと考えています。MenuId
私がこれまでに持っているアイデアは次のとおりです。
null の代わりにハードコードされた UUID (すべてゼロなど) を使用します。
ただし、MenuId
各ユーザーのメニューには FK 制約があるため、ユーザーごとに特別な「null」メニューを作成する必要があり、面倒です。代わりにトリガーを使用して null エントリの存在を確認してください。
これは面倒だと思うので、可能な限りトリガーを避けるのが好きです。さらに、データが決して悪い状態にならないことを保証してくれるとは信じていません。それを忘れて、ミドルウェアまたは挿入関数にnullエントリが以前に存在していないかどうかを確認してください。この制約はありません。
Postgres 9.0 を使用しています。
私が見落としている方法はありますか?