我有下表:
mytable
---------
id Serial PK
action Integer
model VARCHAR
model_id integer
active BOOL
model,model_id,action
但是由于我的逻辑,当 active 为 true 时,不能有具有相同值的重复值。
因此,我放置了一个独特的约束:
ALTER TABLE mytable ADD CONSTRAINT constraint_name UNIQUE (model,model_id,action,active);
但这并不能避免我只有在 active=true 时才具有唯一约束。此外,我的表预先填充了重复值,因此我想在重复值上设置 active=false 并只保留一条记录,value=true
除了在应用约束之前编写更新语句之外,您知道如何做到这一点吗? ?
@ypercube 建议的部分索引可能是最好的解决方案。如果您出于某种原因希望将其保持在逻辑级别,则可以生成一列:
如果 ACTIVE: 连接“部分唯一”列,我使用标记分隔符来区分列,结果为 'a' || 'bc' 应该不同于 'ab' || 'C'
如果 NOT ACTIVE:使用主键而不是“唯一”列
我使用 xyz 作为生成列的名称,因为我不知道更好:-)