相关疑难解决方法(0)

使用空列创建唯一约束

我有一个这种布局的表:

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.我想允许NULLMenuId存储不具有关联菜单中的最爱,但我只希望每个用户/食谱对这些行中最多只有一个.

我到目前为止的想法是:

  1. 使用一些硬编码的UUID(例如全零)而不是null.
    但是,MenuId每个用户的菜单都有一个FK约束,所以我必须为每个用户创建一个特殊的"空"菜单,这是一个麻烦.

  2. 使用触发器检查是否存在空条目.
    我认为这是一个麻烦,我喜欢尽可能避免触发器.另外,我不相信他们能保证我的数据永远不会处于不良状态.

  3. 只需忘记它并检查中间件或插入函数中是否存在空条目,并且没有此约束.

我正在使用Postgres 9.0.

我有什么方法可以忽略吗?

sql postgresql null database-design referential-integrity

219
推荐指数
2
解决办法
8万
查看次数

添加约束以使每列行的列唯一

statusPostgres表中有一列只能有两个值:ActiveInactive.

其中一列被命名userid.该表可以有多个相同的行,userid但最多只能有一行status = 'Active'.我只需要一个或没有statusActiveuserid.如何使用此条件创建约束?我在Postgres文档中找不到任何帮助.

database postgresql constraints unique-index partial-index

6
推荐指数
1
解决办法
1891
查看次数

如何在多列的唯一索引中允许一列的 NULL 值

似乎是一个非常简单的问题,但我似乎无法在网上的任何地方找到具体的答案。

我有一个price引用报价和行项目的模型,因此它有quote_idline_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。

sql postgresql indexing ruby-on-rails unique-constraint

5
推荐指数
1
解决办法
2215
查看次数