问题描述
我的状态如下:started
,calculated
,finished
我需要一个约束,允许一个表中只有一个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
子句结合使用,该子句过滤除“完成”之外的状态以实现所需的逻辑。