sql - 如何添加一个约束来停止具有两个相同值的列仅针对 Postgres 中的某些指定值?
问题描述
基本上,我有一列可以包含一组允许值中的一个(使用外键强制执行)。对于其中一些值,可以任意多行来保存该值。对于其他人,一次只有一行应该保存该值。
架构太大,无法在此处粘贴,但示例如下:
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 不允许在检查约束内进行子查询。
我很确定我可以用一个函数来完成它,但是由于我对架构设计很陌生,所以我对此类问题的“最佳实践”解决方案特别感兴趣,因为它似乎必须是常见的情况,直觉上我认为必须有一个优雅的解决方案。
非常感谢。
解决方案
您可以使用过滤(条件)唯一索引:
create unique index unq_t_is_president on t(is_president) where is_president;
推荐阅读
- javascript - discord.js heroku 除了嵌入式命令外,一切正常,怎么了?
- javascript - 虽然不停止条件
- c# - LineRenderer 没有在鼠标点击的地方绘制
- c# - 我想收到 Xamarin 特定应用程序的通知
- c# - C# WPF 程序按钮单击运行任务,直到另一个按钮单击停止或直到取消令牌有效
- api - 如何在 ASP.NET Core MVC 中存储当前用户
- html - 背景图像不会显示在标题中
- java - java.lang.AssertionError: Status expected:<200> but was:<404> for Spring Boot Rest Controller
- angularjs - $watch 在指令中的使用
- r - R - 如何使用 metafor 包绘制森林图?