有没有可能在sql中生成一个唯一的约束来允许单个用户( user_id
)最多可启用两个条目( enabled
)? 下面是一个例子
user_id | enabled
------------------
123 | true
123 | true
123 | false
456 | true
以上是有效的,但增加了另一个 user_id = 123
以及 enabled = true
将失败,因为将有三个条目。追加 user_id = 123
以及 enabled = false
将是有效的,因为表仍然满足规则。
3条答案
按热度按时间guykilcj1#
不能允许两个值为“enabled”。但这里有一个解决方案,接近你想要的不使用触发器。其思想是将值编码为数字,并对其中两个值实施唯一性:
插入新值有点棘手,因为您需要检查值是在插槽“1”还是“2”中。但是,您可以使用
is_enabled
作为用于查询的布尔值。g52tjvyc2#
你可以通过添加另一个
boolean
列到UNIQUE
或者PRIMARY KEY
约束(或UNIQUE
索引):brtdzjyr3#
前面已经解释过,约束或唯一索引不能强制执行所需的逻辑。
另一种方法是使用物化视图。逻辑是使用窗口函数在视图中创建一个额外的列,每两行具有相同的
(user_id, enabled)
. 然后可以在该列上放置唯一的部分索引。最后,您可以创建一个触发器,在每次插入或更新记录时刷新视图,从而有效地强制执行unique约束。设置就绪后,让我们插入初始内容:
这是可行的,视图的内容现在是:
现在,如果我们尝试插入一个违反约束的行,则会引发一个错误,并且
insert
被拒绝。db小提琴演示