微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL约束仅允许许多可能的值之一

如何解决PostgreSQL约束仅允许许多可能的值之一

我的状态如下:startedcalculatedfinished 我需要一个约束,允许一个表中只有一个NOT finished状态。

这是允许的:

+----+----------+
| id |  status  |
+----+----------+
|  1 | finished |
|  2 | finished |
|  3 | started  |
+----+----------+
+----+------------+
| id |   status   |
+----+------------+
|  1 | finished   |
|  2 | finished   |
|  3 | calculated |
+----+------------+

由于两个未完成状态,这是禁止的:

+----+------------+
| id |   status   |
+----+------------+
|  1 | finished   |
|  2 | finished   |
|  3 | calculated |
|  4 | started    |
+----+------------+

解决方法

您可以使用过滤唯一索引:

create unique index myindex
    on mytable ((1)) 
    where (status <> 'finished')

技巧是将固定值而不是列名传递给索引的on子句(我们需要两个括号,因此Postgres会将其作为表达式求值)。这与where子句结合使用,该子句过滤除“完成”之外的状态以实现所需的逻辑。

Demo on DB Fiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。