如何为Postgres中的某些指定值添加一个约束,以使具有两个相同值的列停止?

问题描述 投票:0回答:1

基本上,我有一列可以具有一组允许值之一(由外键强制)。对于其中一些值,可以任意数量的行保存该值。对于其他用户,一次只能保存一行。

该模式太大,无法在此处粘贴,但是一个说明性示例如下:

name    is_president
Trump   true
Obama   false
Bush    false

因此,只有一行可以具有is_president = true,而多少行具有is_president = false则无关紧要。

我该如何执行这种行为?我考虑过使用检查约束,例如:

CHECK((SELECT count(*) FROM presidents WHERE is_president = true) <= 1 )

但是Postgres不允许在检查约束内进行子查询。

我很确定我可以用一个函数来完成它,但是由于我对模式设计还很陌生,所以我对解决此类问题的“最佳实践”解决方案特别感兴趣,因为它似乎必须是一个常见的案例,从直觉上讲,我认为必须有一个优雅的解决方案。

非常感谢。

sql postgresql database-design database-schema
1个回答
0
投票

您可以使用过滤的(条件)唯一索引:

create unique index unq_t_is_president on t(is_president) where is_president;
© www.soinside.com 2019 - 2024. All rights reserved.