我有一张这样布局的桌子:
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)
, if MenuId IS NULL
。我想允许存储一个没有关联菜单的收藏夹,但我只想要每个用户/食谱对最多这些行中的一个NULL
。MenuId
到目前为止,我的想法是:
使用一些硬编码的 UUID(例如全零)而不是 null。
但是,MenuId
每个用户的菜单都有 FK 约束,所以我必须为每个用户创建一个特殊的“空”菜单,这很麻烦。改为使用触发器检查是否存在空条目。
我认为这很麻烦,我喜欢尽可能避免触发。另外,我不相信他们能保证我的数据永远不会处于不良状态。忘记它并检查中间件或插入函数中先前是否存在空条目,并且没有此约束。
我正在使用 Postgres 9.0。
有什么我忽略的方法吗?