我有一个这种布局的表:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Run Code Online (Sandbox Code Playgroud)
我想创建一个类似于此的唯一约束:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Run Code Online (Sandbox Code Playgroud)
但是,这将允许多行具有相同的(UserId, RecipeId)if MenuId IS NULL.我想允许NULL在MenuId存储不具有关联菜单中的最爱,但我只希望每个用户/食谱对这些行中最多只有一个.
我到目前为止的想法是:
使用一些硬编码的UUID(例如全零)而不是null.
但是,MenuId每个用户的菜单都有一个FK约束,所以我必须为每个用户创建一个特殊的"空"菜单,这是一个麻烦.
使用触发器检查是否存在空条目.
我认为这是一个麻烦,我喜欢尽可能避免触发器.另外,我不相信他们能保证我的数据永远不会处于不良状态.
只需忘记它并检查中间件或插入函数中是否存在空条目,并且没有此约束.
我正在使用Postgres 9.0.
我有什么方法可以忽略吗?
statusPostgres表中有一列只能有两个值:Active和Inactive.
其中一列被命名userid.该表可以有多个相同的行,userid但最多只能有一行status = 'Active'.我只需要一个或没有status为Active每userid.如何使用此条件创建约束?我在Postgres文档中找不到任何帮助.
似乎是一个非常简单的问题,但我似乎无法在网上的任何地方找到具体的答案。
我有一个price引用报价和行项目的模型,因此它有quote_id和line_item_id列。我正在使用多列索引unique: true来防止同一 line_item 的多个价格附加到报价中。quote_id是索引中的第一列。
但是,我希望允许用户添加line_items尚未报价的价格。它适用于一个价格,quote_id为空且line_item_id存在。但是,唯一索引阻止我将第二个价格附加到相同的line_item. 中的空值quote_id被视为唯一的。
有什么方法可以使唯一约束仅在引用不为空时适用?
我知道allow_nil可以在模型验证中使用,但是可以在索引中使用吗?
我在想这样的事情:
add_index :prices, [:quote_id, :line_item_id], :unique => true, :allow_nil => true
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 和 Rails 4。