我有一个具有这种布局的表:
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。
我有什么方法可以忽略的吗?
创建 两个部分索引
:
CREATE UNIQUE INDEX favo_3col_uni_idx ON favorites (user_id, menu_id, recipe_id)
WHERE menu_id IS NOT NULL;
CREATE UNIQUE INDEX favo_2col_uni_idx ON favorites (user_id, recipe_id)
WHERE menu_id IS NULL;
这样,只能存在(user_id, recipe_id)
where的一种组合menu_id IS NULL
,从而有效地实现所需的约束。
可能的缺点:您不能有外键引用(user_id, menu_id, recipe_id)
,不能CLUSTER
基于部分索引,并且没有匹配WHERE
条件的查询不能使用部分索引。(似乎不太可能希望FK引用宽三列-
改用PK列)。
如果您需要一个 完整的 索引,则可以从中删除WHERE
条件,favo_3col_uni_idx
并且仍然可以执行您的要求。
现在组成整个表的索引与另一个表重叠,并且变得更大。根据典型的查询和NULL
值的百分比,这可能有用也可能没有用。在极端情况下,甚至可以帮助维护所有三个索引(两个局部索引和总索引排在最前面)。
另外:我建议不要在PostgreSQL中使用大小写混合的标识符。
问题内容: 这是我的模型: 每个书的编号从每位作者的1开始并向上递增。因此,我们将有John Grisham撰写的1,2,3本书,George Martin撰写的1..5本书,等等。 我是否可以设置一个唯一的约束条件,以确保我们不会有两本书的作者相同?与相似,但约束仅适用于?的复合 问题答案: 用途:
我正在创建一个简单的实体,并试图将它持久化到Oracle数据库中。这是我的天赋: 这是我的Java类,它创建了这个实体的一个实例,并使用HiberNate将其保存到数据库中: 当我运行这个程序时,我得到一个异常: 请帮助我在此代码中犯错误的地方。我正在使用 更新:这是我的Hibernate配置文件,表由Hibernate本身生成: 另外,如果可能的话,请给我推荐一个Hibernate-4.3的好资
我有一个使用Hibernate访问数据库的应用程序。它会抛出如下错误: 组织Spring框架清洁工厂。BeanCreationException:创建URL[文件:/C:/Program Files(x86)/XXX/applicationContext.xml]中定义的名为“sessionFactory”的bean时出错:初始化方法调用失败;嵌套异常是org.hibernate。Annotati
问题内容: 我想在MySQL表中添加一列,命名为。在此列中,只有一个记录可以设置为。 如何使用mysql将这个约束添加到我的列中? 谢谢! 更新 如果不是一个限制,我应该添加。我们如何处理数据库上的此类问题? 问题答案: 我认为这不是对单个默认值的情况进行建模的最佳方法。 取而代之的是,我将IsDefault列留在外面,并创建一个单独的表,该表只有一行,并且只有构成主表主键的列。在此表中,放置标识
问题内容: 我有一个存储产品代码的字段。该代码是唯一的,但是某些产品根本没有代码。我无法发明代码,因为它们是提供商代码。 在MySQL中这种约束可能吗? 我是一个存储过程和触发器的菜鸟,所以如果解决方案涉及其中之一,请耐心等待。 更新:列不为空。这就是为什么我无法做到这一点。 问题答案: 是的,您可以这样做。参见MySQL参考(版本5.5)。 UNIQUE索引会创建约束,以使索引中的所有值都必须不
问题内容: 不知道在PostgreSQL 9.3+中是否可行,但是我想在非唯一列上创建唯一索引。对于像这样的表: 我想仅能[快速]查询不同的日子。我知道我可以用来帮助执行不同的搜索,但是如果不同值的数量大大少于索引覆盖的行数,这似乎会增加额外的开销。就我而言,大约30天中有1天与众不同。 我是创建关系表以仅跟踪唯一条目的唯一选择吗?思维: 并在每次插入数据时使用触发器来更新它。 问题答案: 索引只