我有一个表orders
,列是:id
、user_id
和status
。status
列是枚举,其值为:pending、in_process、completed、decided。
我需要禁止一个用户有一个以上的订单与status in (pending, in_process)
。
例如,具有表:
| 身份证|地位|用户标识|
| --------------|--------------|--------------|
| 1|已完成|1|
| 第二章|正在处理|1|
| 三|待定|第二章|
对于user_id=1
,我们不能再插入一个状态为pending
或in_process
的订单。
我觉得我应该在这里使用一个排除约束,但不知道如何禁止两个集合的交集。
3条答案
按热度按时间ibrsph3r1#
这里你不是在寻找一个排除约束(因为你想允许任何数量的
completed
行,它们都具有相同的user_id
和status
值),而是一个conditionally unique constraint-postgres不支持CONSTRAINT
,但你可以使用partialUNIQUE
index:或
lf3rwulv2#
你要找的是一个partial unique index。因为
status
是一个枚举,所以你很可能必须对数组进行类型转换。xdyibdwo3#
Belayer和Bergi击败我张贴部分独特的方法,所以对于体育:您 * 可以 * 使排除约束对此起作用。demo
在这些
where status in ('pending','in_process')
中,没有两个user_id
可以是相同的。我说这是 * 为体育 *,因为它可以工作,但没有提供超过partial unique的好处:
尽管允许使用B树或哈希索引,但使用带有排除约束的索引没有什么意义,因为这并没有比普通的唯一约束做得更好的事情。